Номера с плавающей запятой не могут точно представлять все десятичные числа в пределах их диапазона. Например, 0,9 не точно 0,9, это число действительно близко к 0,9, которое заканчивается печатанием, как это в большинстве случаев. Поскольку вы выполняете вычисления с плавающей запятой, эти ошибки могут накапливаться, и вы заканчиваете что-то очень близкое к правильному числу, но не точно равное ему. Например, 0.3 * 3 == 0.9
вернет false
. Это относится к каждому компьютерному языку, который вы когда-либо использовали, - это просто математическая математика с плавающей запятой. См., Например, this question about 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
Какая версия Ruby? 1.8.6 имеет некоторые арифметические ошибки с плавающей точкой. – mckeed
Привет, вы также можете проверить мое сообщение по вопросам с плавающей точкой http://vladzloteanu.wordpress.com/2010/01/11/why-you-shouldnt-use-float-for-currency-floating-point-issues-explained -for-ruby-and-ror/ –