Los números de coma flotante no pueden representar con precisión todos los números decimales dentro de su rango. Por ejemplo, 0.9 no es exactamente 0.9, es un número realmente cercano a 0.9 que termina imprimiéndose como en la mayoría de los casos. Al hacer cálculos de coma flotante, estos errores pueden acumularse y terminar con algo muy cercano al número correcto pero no exactamente igual a él. Por ejemplo, 0.3 * 3 == 0.9
devolverá false
. Este es el caso en todos los lenguajes de cómputo que usará en su vida, así es como funciona la matemática binaria flotante. Ver, por ejemplo, this question about Haskell.
Para probar la igualdad de coma flotante, generalmente quiere comprobar si el número se encuentra dentro de un rango muy pequeño del objetivo. Así, por ejemplo:
def float_equal(a, b)
if a + 0.00001 > b and a - 0.00001 < b
true
else
false
end
end
también puede utilizar la clase BigDecimal en Ruby para representar números decimales arbitrarias.
Si se trata de un caso de prueba, puede utilizar assert_in_delta
:
def test_some_object_total_is_calculated_correctly
assert_in_delta 22.23, some_object.total, 0.01
end
¿Qué versión de Ruby? 1.8.6 tiene algunos errores aritméticos flotantes. – mckeed
Hola, también puedes consultar mi publicación sobre problemas de coma flotante http://vladzloteanu.wordpress.com/2010/01/11/why-you-shouldnt-use-float-for-currency-floating-point-issues-explained -for-ruby-and-ror/ –