In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Problema Increible

Foro público de Xailer en español
Responder
Marco Scolamieri
Mensajes: 30
Registrado: Vie Mar 26, 2010 10:07 pm

Problema Increible

Mensaje por Marco Scolamieri »

Hola, me esta pasando esta diferencia que no se de donde sale, me pueden ayudar a saber en que me equivoco?
// importe1:= 132.90 // con estos 2 valores da una diferencia positiva
// importe2:= 100.00
importe1:= 332.90 // con estos 2 valores da una diferencia negativa
importe2:= 300.00
Diferencia1:= importe1-importe2
Diferencia2 := Diferencia1 - 32.90
IF (Diferencia2 == 0.00 )
Salida:= "Es Igual"
ENDIF
IF (Diferencia2 > 0 )
Salida:= "Es Mayor"
ENDIF
IF (Diferencia2 < 0 )
Salida:= "Es Menor"
ENDIF
msginfo(Salida)
// ES INCREIBLE PERO SALE POR MENOR
// ENTONCES VERIFICO DE ESTA MANERA
imp3 := importe1 * 100000000000000000
imp4 := importe2 * 100000000000000000
ImpConDif := Diferencia2 * 10000000000000000000
// ImpConDif es = a -213162,82 y debia ser cero, por eso sale por menor.
Muchas gracias, Marco
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Problema Increible

Mensaje por jasm.quitaesto »

Es un problema de redondeo que se conoce desde hace mucho tiempo.
Para solucionarlo, convierte los números a comparar a cadena y compara
las cadenas.
cDif1 := Alltrim( Str( Diferencia1, 5, 2 ) )
cDif2 := Alltrim( Str( Diferencia2, 5, 2 ) )
IF cDif1 == cDif2
..
..
..
END IF
etc..
Saludos
Alf+.
El 02/10/2012 22:56, Marco Scolamieri escribió:
> Hola, me esta pasando esta diferencia que no se de donde
> sale, me pueden ayudar a saber en que me equivoco?
>
>
> // importe1:= 132.90 // con estos 2 valores da una
> diferencia positiva
> // importe2:= 100.00
>
> importe1:= 332.90 // con estos 2 valores da una
> diferencia negativa
> importe2:= 300.00
>
> Diferencia1:= importe1-importe2
> Diferencia2 := Diferencia1 - 32.90
>
> IF (Diferencia2 == 0.00 )
> Salida:= "Es Igual"
> ENDIF
>
> IF (Diferencia2 > 0 )
> Salida:= "Es Mayor"
> ENDIF
>
> IF (Diferencia2 < 0 )
> Salida:= "Es Menor"
> ENDIF
>
> msginfo(Salida)
>
> // ES INCREIBLE PERO SALE POR MENOR
> // ENTONCES VERIFICO DE ESTA MANERA
>
> imp3 := importe1 * 100000000000000000
> imp4 := importe2 * 100000000000000000
> ImpConDif := Diferencia2 * 10000000000000000000
>
> // ImpConDif es = a -213162,82 y debia ser cero, por eso
> sale por menor.
>
>
> Muchas gracias, Marco
Avatar de Usuario
emeasoft
Mensajes: 1094
Registrado: Mié Abr 01, 2009 4:12 pm
Ubicación: emeasoft
Contactar:

Problema Increible

Mensaje por emeasoft »

Hola:
Prueba con Round(Diferencia1 - 32.90 , 2)
Saludos
Mário Angelini
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9442
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Problema Increible

Mensaje por ignacio »

Buenos dí­as,
Tanto en Clipper, como en Harbour cuando los valores numéricos tienen parte decimal internamente se gestionan como de tipo 'double'. Este tipo de datos contiene números de coma flotante de 64 bits (8 bytes) que admiten valores muy grandes pero tienen como gran inconveniente que son valores que almacenan aproximaciones de números reales, pero no el número exacto, y por lo tanto las comparaciones a veces provocan resultados no deseados.
La solución es fácil: utilice siempre la función Round() en ambos lados de la comparación para asegurarse resultados correctos cuando utilice valores numéricos con decimales:
if Round( x, 2 ) == Round( y, 2 )
...
Saludos
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder