Основные номера 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.