Мне нужна помощь в понимании точности с плавающей запятой в ruby
Я столкнулся с этим на днях и уверен, что это не доставляет мне никаких проблем, но мне просто любопытно, почему это происходит?
1.9.2p320 :001 > 0.39-0.09
=> 0.30000000000000004
2 ответа
Это потому, что Ruby по умолчанию использует формат с плавающей запятой двойной точности. Вы можете прочитать о проблемах, связанных с этим здесь. Однако вот короткий и четкий ответ:
Поскольку внутренне, компьютеры используют формат (двоичная с плавающей точкой), который не может точно представить число как 0,1, 0,2 или 0,3 вообще.
Когда код компилируется или интерпретируется, ваш "0.1" уже округляется до ближайшего числа в этом формате, что приводит к небольшой ошибке округления даже до того, как произойдет вычисление.
Источник: http://floating-point-gui.de/
Числа с плавающей точкой не могут точно представлять все действительные числа, а операции с плавающей точкой не могут точно представлять истинные арифметические операции, это приводит ко многим удивительным ситуациям.
Я советую читать: https://en.wikipedia.org/wiki/Floating_point
Вы можете использовать BigDecimal, чтобы избежать таких проблем.