Comparando reales sin terminos naturales

Lo 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

Nada fuera de lo normal, ¿no?. ¿O si?.

2 Comentarios »

RSS feed para los comentarios de esta entrada.

  1. avatar

    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 #

  2. avatar


    >> 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 #

Dejar un comentario

XHTML permitido: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Creative Commons License 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