Непоследовательное округление в Ruby? - PullRequest
2 голосов
/ 23 декабря 2009

Есть ли в Ruby ошибка при округлении? Почему он ведет себя так:

>> [1.14, 1.15, 1.16].map{|x| "%.1f" % x}
=> ["1.1", "1.1", "1.2"]
>> [1.4, 1.5, 1.6].map{|x| "%.0f" % x}
=> ["1", "2", "2"]

как, почему 1,15 округляется до 1,1, а 1,5 округляется до 2? По крайней мере, не противоречит ли это? одинаковое поведение в ruby ​​1.9.1 и ruby ​​1.8.7.

Ответы [ 3 ]

5 голосов
/ 23 декабря 2009

Посмотрите на мой ответ на этот вопрос

Почему sprintf в Perl неправильно округляет числа с плавающей запятой?

Это может быть то же самое

2 голосов
/ 23 декабря 2009

Вы используете числа с плавающей запятой. Числа с плавающей точкой не точны. См. http://en.wikipedia.org/wiki/IEEE_754-2008 для введения в стандарт.

Короткая версия: НИКОГДА не используйте поплавки для чего угодно, где вам нужна точность!

1 голос
/ 23 декабря 2009

Полезно вспомнить и также довольно иронично размышлять, но числа с плавающей запятой представляют только точно: (a) несколько дробей или (b) все целые числа.

Таким образом, для точного представления дробь должна состоять из (отрицательных) степеней двух. Итак, следующие дроби являются единственными, которые точно представлены между 0,01 и 0,99:

0.25
0.50
0.75

Другими словами, FP совершенно точен при работе с целыми числами. Пойди разберись.

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