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
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.
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
-
- Mensajes: 30
- Registrado: Vie Mar 26, 2010 10:07 pm
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
Problema Increible
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
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
Problema Increible
Hola:
Prueba con Round(Diferencia1 - 32.90 , 2)
Saludos
Mário Angelini
Prueba con Round(Diferencia1 - 32.90 , 2)
Saludos
Mário Angelini
- ignacio
- Site Admin
- Mensajes: 9442
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Problema Increible
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
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
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com