Проблема округления Python - PullRequest
1 голос
/ 21 мая 2010
>>> num = 4.123456
>>> round(num, 3) # expecting 4.123
4.1230000000000002

Я ожидаю 4.123 в результате, я не прав?

Ответы [ 4 ]

7 голосов
/ 21 мая 2010

Это не ошибка. Вам нужно прочитать то, что должен знать каждый компьютерный ученый об арифметике с плавающей точкой:

http://docs.sun.com/source/806-3568/ncg_goldberg.html

6 голосов
/ 21 мая 2010

Да, ваши ожидания не соответствуют замыслу ваших инструментов.

Изучите этот раздел руководства по Python.


Использование math.round на самом деле довольно редко. если вы пытаетесь отобразить число в виде строки с определенной точностью, вам может потребоваться что-то более похожее на

>>> num = 4.123456
>>> print "%.3f" % num
4.123

Возможно, вас заинтересует документация по форматированию строки .

4 голосов
/ 21 мая 2010

Почему тебя это волнует? (Это серьезный вопрос.)

Ответ, который вы получаете, настолько близок к 4.123, что не имеет значения. Это не может быть точно 4.123, так как существует только конечное число чисел (около 2**64 на типичной машине), которые Python может представлять точно, и не вдаваясь в подробности о представлениях с плавающей точкой, просто так получается, что 4.123 не является одним из тех чисел. Кстати, 4.1230000000000002 тоже не одно из чисел, которое может быть точно представлено; сохраненное действительное число - 4.12300000000000022026824808563105762004852294921875, но Python укорачивает десятичное представление до 17 значащих цифр для отображения. Итак:

  1. Если вы занимаетесь математикой с результатом, тогда разница между 4.123 и тем, что вы получаете, настолько мала, что не имеет никакого значения. Только не беспокойся об этом.
  2. Если вы просто заботитесь о том, чтобы вывод был красивым (то есть, то, что вам нужно, это строка, а не число), тогда используйте str или форматирование строки.
  3. В маловероятном случае, когда разница действительно имеет значение, например, потому что вы выполняете финансовую работу, и это влияет на направление, в котором что-то округляется позже, используйте модуль decimal.

Последнее замечание: в Python 3.x и Python 2.7 repr для float изменилось, так что вы получите 4.123, как вы ожидаете здесь.

2 голосов
/ 21 мая 2010

Если вы хотите иметь точное представление вашего числа с плавающей запятой, вы должны использовать decimal.

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