Подтвердить что ты не робот

Может кто-нибудь объяснить это: 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?

4b9b3361

Ответ 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. Очевидно, что тип данных должен иметь достаточно большое значение для хранения номера.

Я рекомендую полезную веб-страницу Роба Кеннеди как хороший инструмент для исследования представимости.