Problema con redondeo

Re: Problema con redondeo

Postby cnavarro » 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: Select all  Expand view

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
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Problema con redondeo

Postby informaticaeloy » 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=base*0.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
User avatar
informaticaeloy
 
Posts: 118
Joined: Fri Dec 20, 2013 10:39 am
Location: Zaragoza, España

Re: Problema con redondeo

Postby D.Fernandez » Sat Jan 25, 2014 2: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 22.12, Harbour, MVS2022 Community, BCC, MySql & MariaDB, Dbf/Cdx VSCode.
Maldonado - Uruguay
D.Fernandez
 
Posts: 455
Joined: Wed Jul 31, 2013 1:14 pm
Location: Maldonado - Uruguay

Re: Problema con redondeo

Postby informaticaeloy » Sat Jan 25, 2014 3: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
User avatar
informaticaeloy
 
Posts: 118
Joined: Fri Dec 20, 2013 10:39 am
Location: Zaragoza, España

Re: Problema con redondeo

Postby Armando » Sat Jan 25, 2014 5: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
User avatar
Armando
 
Posts: 3061
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 95 guests