Основные номера Python!

Почему 0.1 + 0.1 + 0.1 - 0.3 оценивает5.5511151231257827e-17 в питоне?

6 ответов

Решение

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

>>> print '%.2f' % (0.1+0.1+0.1-0.3,)
0.00

Это проблема с числами с плавающей запятой вообще. Смотрите этот раздел в Википедии для описания. Грубо говоря - есть ошибки округления. Обратите внимание, что число, которое вы дали нам, было очень маленьким - около 0,00000000000000005551115123 . Вот более технический документ на эту тему.

Возможно, вам будет интересно узнать, что Python 3 улучшил ситуацию, изменив способ repr работает. Теперь он даст вам самое короткое строковое представление, которое будет преобразовано обратно в исходное значение с плавающей точкой:

Python 3.1.1+ (r311: 74480, 11 октября 2009 г., 20:19:13) 
[GCC 4.3.4] на linux2
Введите "помощь", "авторское право", "кредиты" или "лицензия" для получения дополнительной информации.
>>> 0.1
"0,1"

Старые версии ведут себя так:

Python 2.6.4 (r264: 75706, 28 октября 2009 г., 22:19:17) 
[GCC 4.3.4] на linux2
Введите "помощь", "авторское право", "кредиты" или "лицензия" для получения дополнительной информации.
>>> 0.1
"0,10000000000000001"

Это только вывод repr (вызывается неявно при вводе значения в интерактивном интерпретаторе), который изменился. Базовые значения по-прежнему являются числами с плавающей запятой IEEE-754, и они по-прежнему имеют обычные ограничения:

Python 3.1.1+ (r311: 74480, 11 октября 2009 г., 20:19:13) 
[GCC 4.3.4] на linux2
Введите "помощь", "авторское право", "кредиты" или "лицензия" для получения дополнительной информации.
>>> 0.1
0,1
>>> 0.2
0.2
>>> 0.3
0,3
>>> 0.1 + 0.2
+0,30000000000000004
>>> 0,1 + 0,2 - 0,3
5.551115123125783e-17

Из-за того, что числа с плавающей запятой представлены в компьютере. Это не просто вещь Python.

В качестве примера рассмотрим представление 1/3 в качестве научного числа в базе 10. Имея только конечное число цифр (скажем, 10), вы получите ошибку округления. Скажите 1/3 ≈ 0,3333333333e0. Тогда 1/3+1/3+1/3 (после первого преобразования в десятичные разложения) представляется как 0.9999999999e0, но 1 равно 1.0e0. Аналогично, 1/7 ≈ 0,1428571429e0, а 1/7+1/7 будет 0,2857142858e0, но представление для 2/7 будет 0,2857142857e0. В обоих случаях сумма выключена на 1e-10.

Другие вопросы по тегам