Смущает Ruby с плавающей точкой - PullRequest
1 голос
/ 07 февраля 2011

Метод усечения в Float, очевидно, усекает число с плавающей точкой до целого числа.Итак, что здесь происходит:

>> 14820.truncate
=> 14820
>> (148.2 * 100)
=> 14820.0
>> 14820.0.truncate
=> 14820
>> (148.2 * 100).truncate
=> 14819

почему последнее вычисление также не выдает 14820?

Ответы [ 4 ]

5 голосов
/ 07 февраля 2011

Ошибка округления с плавающей точкой, которая не связана с truncate.Например, попробуйте это

 (148.2 * 100) < 14820

Возвращает true.Образно говоря, вы получаете число 148.199999999 вместо 148.2, потому что 148.2 нельзя представить точно в числе с плавающей запятой.

3 голосов
/ 07 февраля 2011

Результат 148.2 * 100, скорее всего, не совсем 14820, а скорее немного меньше этого значения из-за ошибки с плавающей запятой.Таким образом, оно будет усечено до 14819.

Значение можно увидеть с помощью этого:

>sprintf("%.19f", 148.2*100)
=> "14819.9999999999981810106"
0 голосов
/ 08 февраля 2011

Рассматривали ли вы округление вместо усечения?

0 голосов
/ 07 февраля 2011

Как сказано выше, это ошибка округления с плавающей запятой.Я добавлю, что в Ruby есть встроенный класс Rational , который может представлять рациональные дроби без такого недостатка, поэтому вы можете использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...