Página 1 de 1

Problema Increible

Publicado: Mar Oct 02, 2012 10:56 pm
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

Problema Increible

Publicado: Mié Oct 03, 2012 10:44 am
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

Problema Increible

Publicado: Mié Oct 03, 2012 12:29 pm
por emeasoft
Hola:
Prueba con Round(Diferencia1 - 32.90 , 2)
Saludos
Mário Angelini

Problema Increible

Publicado: Mié Oct 03, 2012 1:49 pm
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