Может кто-нибудь объяснить это: 0.2 + 0.1 = 0.30000000000000004?
Возможный дубликат:
Как хранится плавающая запятая? Когда это имеет значение?
Почему в интерпретаторе Python происходит следующее:
>>> 0.1+0.1+0.1-0.3
5.551115123125783e-17
>>> 0.1+0.1
0.2
>>> 0.2+0.1
0.30000000000000004
>>> 0.3-0.3
0.0
>>> 0.2+0.1
0.30000000000000004
>>>
Почему не 0.2 + 0.1 = 0.3
?
Ответы
Ответ 1
Это потому, что .1
не может быть точно представлено в двоичном представлении с плавающей запятой. Если вы попробуете
>>> .1
Python ответит с помощью .1
, потому что он печатает только до определенной точности, но там уже есть небольшая ошибка округления. То же самое происходит с .3
, но при выпуске
>>> .2 + .1
0.30000000000000004
тогда округляются ошибки округления .2
и .1
. Также обратите внимание:
>>> .2 + .1 == .3
False
Ответ 2
Не все числа с плавающей запятой точно представлены на конечной машине. Ни 0,1, ни 0,2 точно не представлены в двоичной плавающей точке. И равно 0.3.
Число точно представимо, если оно имеет вид a/b, где a и b являются целыми числами, а b - степенью 2. Очевидно, что тип данных должен иметь достаточно большое значение для хранения номера.
Я рекомендую полезную веб-страницу Роба Кеннеди как хороший инструмент для исследования представимости.