FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Problema con redondeo
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Problema con redondeo
Posted: Sat Jan 25, 2014 12:07 PM
Eloy, calcula el IVA sin redondear la base y después antes de grabar redondeas a 2 decimales.
Prueba estos ejemplos a ver que tal


Code (fw): Select all Collapse
Function Eloy()
local nValor

    Calcula( 7 )

    Calcula( 17.37 )

    Calcula( 13.53 )

    Calcula( 17 )

    Calcula( 8 )

    Calcula( 9 )

Return nil

Function Calcula( nValor )
Local nBase
Local nIva
Local nIva1
Local nTotal

      nBase  := ROUND( nValor / 1.21, 8 ) 
                
      nIva   := ROUND( nBase  * 0.21, 8 )

      nBase  := Round( nBase, 2 )

      nIva   := Round( nIva, 2 )

      nIva1  := nValor - nBase

      nTotal := nBase + nIva

      MsgInfo( "Valor..: "+Str( nValor, 8, 2 ) + CRLF + ;
               "Base...: "+Str( nBase , 8, 2 ) + CRLF + ;
               "Iva....: "+Str( nIva  , 8, 2 ) + CRLF + ;
               "Iva1...: "+Str( nIva1 , 8, 2 ) + CRLF + ;
               "Total..: "+Str( nTotal, 8, 2 ) )

Return nil
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 118
Joined: Fri Dec 20, 2013 10:39 AM
Re: Problema con redondeo
Posted: Sat Jan 25, 2014 12:35 PM

Hola compañeros,
en todos los ejemplos los cálculos son correctos y los hace bien. Por ejemplo, el último de cristobal,

le pasas 7€ y calcula la base con

nBase := ROUND( nValor / 1.21, 8 )

una vez que sabemos la base, se calcula el iva

  nIva   := ROUND( nBase  * 0.21, 8 )

se redondean la base y el importe de iva

  nBase  := Round( nBase, 2 )

  nIva   := Round( nIva, 2 )

y se comprueba todo

  nIva1  := nValor - nBase

  nTotal := nBase + nIva

Hasta ahí todo bien. Ahora en la base de datos guardo los 3 valores
base 5.79€ iva 1.21€ y total 7€

ahora el cliente se mete en la ficha del articulo y le salen los 3 valores, pero cambia el precio base a 25€. El programa ha de recalcular el importe de iva y final. Más tarde se da cuenta de que el precio correcto eran 5.79€ de base. Lo modifica y el programa recalcula la base y el total.
Ha ciendo las operaciones al revés:
si base=5.79
iva=base0.21 => 1.2159€ que redondeando a 2 decimales son 1.22€
para el total podemos hacer: base
1.21 => 7.0059€ => 7.01€ o también: base+iva => 5.79 + 1.2159 => 7.01€

Por eso la única solución que he encontrado es indicar en la base de datos que este artículo se vende a 7 € fijo y calcular la base y el iva hacia atrás, como lo calcula cristobal anteriormente, o indicar que este artículo tiene una base fija de 5.79€ y calcular el iva y el total hacia adelante.

jaja, os imaginais que nos paran por la calle y nos entrevistan para la tele y te preguntan ¿usted sabe calcular el iva de cabeza? a ver, ¿cuanto es el iva de 7€? y le suelto todo este rollo, jaja.

Windows 10 + FWH 20.08 + BCC 7.4 + Harbour 3.2.0 + PSPad 5.0.3
Posts: 555
Joined: Wed Jul 31, 2013 01:14 PM
Re: Problema con redondeo
Posted: Sat Jan 25, 2014 02:06 PM

Hola Eloy:

Por favor, prueba lo que te mande funciona aqui para mi.

Son 2 xRound()...La explicacion esta en un mensaje nuevo...antes de estos.

Saludos.

Dario Fernandez

FWH 2501, Harbour, MVS2022 Community, MySql & MariaDB, Dbf/Cdx VSCode.

Maldonado - Uruguay
Posts: 118
Joined: Fri Dec 20, 2013 10:39 AM
Re: Problema con redondeo
Posted: Sat Jan 25, 2014 03:48 PM

Hola Rubén,

he probado con tu función xround haciendo dos redondeos, pero para lo que quiero tendría que funcionar de dos maneras:

si tengo el precio final 7€
MsgInfo(xround( xROUND(7/1.21,3),2 ) )

y con esto me calcula la base, y con 7-xround( xROUND(7/1.21,3),2 ) tendría el importe del iva

ahora si guardo estos tres valores en la base de datos, 7€, 1,21€ y 5,79€, tendría que poder tomas estos valores de la base de datos posteriormente y hacer la operación a la inversa.
Así pues, con el sistema de redondeos de xround:

MsgInfo(xround( xROUND(5.79*1.21,3),2 ) ) ya sale 7,01€.
Por eso he llegado a la conclusión de que no es por el redondeo, si no que es imposible matemáticamente encontrar un valor de 2 decimales que al aplicarle un 21% nos salga 7,00€, y si lo consigo truncando valor a partir del tercer , cuarto o quinto decimal, sale bien, pero falla con 8€ de precio final, ya que entonces me sale 8.01€ o 7,99€.

En otros programas demo que he probado, al hacer esto, siempre preguntan si el precio introducido es PVP con iva incluido o sin iva, y a partir de entonces hasta cambia el formato de ventana para la introducción de datos.

Muchas gracias. por vuestro interés. Un saludo.

Windows 10 + FWH 20.08 + BCC 7.4 + Harbour 3.2.0 + PSPad 5.0.3
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Problema con redondeo
Posted: Sat Jan 25, 2014 05:05 PM

Eloy:

Tal vez voy a escribir una tontería pero en vista de que matemáticamente no es posible obtener la cifra que
deseas, esta podría ser una alternativa:

7.00 / 1.21 = 5.78 // Obtenemos la base gravable
7.00 - 5.785 = 1.22 // Obtenemos el IVA
5.78 + 1.22 = 7.00

Otro ejemplo

8.00 / 1.21 = 6.61
8.00 - 6.61 = 1.39
6.61 + 1.39 = 8.00

Seguramente, en algunos casos, el IVA no es exacto por las razones que ya sabemos, sin embargo, no
olvidemos que el IVA es provisional y al hacer la declaración correspondiente entre IVA cobrado e IVA
pagado se hará el ajuste correspondiente. Los colegas contadores nos pueden aclarar un poco mas este
tema.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero

Continue the discussion