Comparando reales sin terminos naturales
Publicado por blaxter - 17 Abr 2008 a las 20:52Lo sé, el título no tiene mucho sentido, pero quería hacer una rima. Veamos una pequeña sesión en la consola de ruby
>> value = 69.99
=> 69.99
>> value * 100
=> 6999.0
>> value * 100 == 6999.0
=> false
>> a = value * 100
=> 6999.0
>> b = 6999.0
=> 6999.0
>> a.class == b.class && a.is_a?(Float)
=> true
>> print "#{a} es distinto a #{b} obviamente" unless a == b
6999.0 es distinto a 6999.0 obviamente
>> a.floor
=> 6998
=> 69.99
>> value * 100
=> 6999.0
>> value * 100 == 6999.0
=> false
>> a = value * 100
=> 6999.0
>> b = 6999.0
=> 6999.0
>> a.class == b.class && a.is_a?(Float)
=> true
>> print "#{a} es distinto a #{b} obviamente" unless a == b
6999.0 es distinto a 6999.0 obviamente
>> a.floor
=> 6998
Nada fuera de lo normal, ¿no?. ¿O si?.
En Programación |
2 Comentarios »
RSS feed para los comentarios de esta entrada.
Dejar un comentario
Esta obra está bajo una
licencia de Creative Commons.
Este blog funciona gracias a WordPress
con el theme GimpStyle
diseñado por Horacio Bella y adaptado por un servidor.
Feed entradas
Todo normal, ya sabemos que los decimales (aunque sean punto cero) y los ordenadores no se llevan muy bien….
Se bueno.
Comentario por chuidiang — 17 Abril, 2008 @ 22:14 #
>> 69.99 * 100.0 - 6999.0
=> -9.09494701772928e-13
Si se hace esto mismo (usando reales), en cualquier otro lenguaje (c, java, python, perl, etc…) se obtendrá lo mismo. Es fallo de redondeo por usar coma flotante. Por eso siempre se recomienda que para representar valores numéricos de precios o divisas usar siempre su representación en enteros. Es decir para guardar 69,99€ en una base de datos, se debe de guardar el valor entero ‘6999′.
Luego en cada lenguaje siempre existen librerías para tratar con números con decimales de forma digna las cuales representan los números como cadenas de texto.
>> value = BigDecimal('69.99')
>> value * 100 == 6999.0
=> true
Comentario por blaxter — 17 Abril, 2008 @ 22:45 #