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 Thoughts on “Comparando reales sin terminos naturales

  1. Todo normal, ya sabemos que los decimales (aunque sean punto cero) y los ordenadores no se llevan muy bien….

    Se bueno.


  2. >> 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

Post Navigation