Числа с плавающей точкой не могут точно представлять все десятичные числа в пределах их диапазона. Например, 0,9 - это не совсем 0,9, это число, действительно близкое к 0,9, которое печатается в большинстве случаев. Когда вы выполняете вычисления с плавающей запятой, эти ошибки могут накапливаться, и вы получите что-то очень близкое к правильному числу, но не точно равное ему. Например, 0.3 * 3 == 0.9
вернет false
. Так обстоит дело с каждым языком программирования, который вы когда-либо будете использовать - это просто то, как работает двоичная математика с плавающей точкой. См., Например, этот вопрос о Haskell .
Чтобы проверить равенство с плавающей запятой, вы обычно хотите проверить, находится ли число в некотором крошечном диапазоне от цели. Так, например:
def float_equal(a, b)
if a + 0.00001 > b and a - 0.00001 < b
true
else
false
end
end
Вы также можете использовать класс BigDecimal в Ruby для представления произвольных десятичных чисел.
Если это тестовый пример, вы можете использовать assert_in_delta
:
def test_some_object_total_is_calculated_correctly
assert_in_delta 22.23, some_object.total, 0.01
end