2013-07-27 3 views
1

Почему это происходит и как мне избежать этой проблемы?Вычитание вычетов в Python

Python 2.7.5 (default, Jun 27 2013, 09:29:43) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 0.3 - 0.1 - 0.1 - 0.1 
2.7755575615628914e-17 
>>> 0.3 - 0.3 
0.0 
>>> 0.3 - 0.2 
0.09999999999999998 
+1

Возможный дубликат [Ограничения по плавающей запятой] (http://stackoverflow.com/questions/406361/floating-point-limitations) и http://stackoverflow.com/questions/588004/is-javascripts-floating-point -math-broken –

ответ

3

Поскольку внутри, компьютеры используют формат (двоичная с плавающей точкой), который не может точно представить ряд, как 0,1, 0,2 или 0,3 на всех.

Когда код скомпилирован или интерпретирован, ваш «0,1» уже округлен до ближайшего номера в этом формате, что приводит к небольшой ошибке округления даже до того, как произойдет расчет.

What every programmer should know about floating point: Basic Answers

Кроме того, если вы заинтересованы в получении вокруг этого, проверить представление с фиксированной точкой. Python seems to have a variety of solutions.

+2

Модуль «десятичный», который включен, представляется наиболее показанным решением. Из документов: * «Точность переносится в арифметику. В десятичной плавающей точке 0.1 + 0.1 + 0.1 - 0.3 точно равна нулю. В двоичной с плавающей запятой результат равен 5.5511151231257827e-017. различия предотвращают надежное тестирование равенства и могут накапливаться различия. По этой причине десятичное значение предпочтительнее в приложениях учета, которые имеют строгие инварианты равенства ». * – heltonbiker