Мне нужна помощь в понимании точности с плавающей запятой в 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, чтобы избежать таких проблем.

Другие вопросы по тегам