Округление формата Python по умолчанию при форматировании числа float
Я пытаюсь решить некоторые проблемы с плавающей запятой в моем коде в Python 2.7.10. При тестировании я столкнулся со странным поведением с format
способ:
print "{}".format(0.3000000000004) # 13 decimals
принты: 0.3
но:
print "{}".format(0.300000000004) # 12 decimals
принты: 0.300000000004
поскольку я не указываю формат, почему он округляет первое число? Есть ли количество разрешенных знаков после запятой по умолчанию?
2 ответов
поскольку формат не указан, используется тип принуждения по умолчанию к string. Так что это не проблема с format
. Python 2 усекает с точностью до 12 символов (исключая начальный ноль, если таковой имеется) для float.__str__
, и после усечения в этом случае все конечные нули очищаются:
>>> str(0.3000000000004) # unlike str(0.3000000000014) -> '0.300000000001'
'0.3'
добавлять format_spec
:f
дает вам точность по умолчанию 6:
>>> '{:f}'.format(0.3000000000004)
'0.300000'
укажите ширину и точность или используйте repr
чтобы получить хороший представление:
>>> '{!r}'.format(0.3000000000004)
'0.3000000000004'
поведение отличается в Python 3, хотя:
>>> str(0.3000000000004)
'0.3000000000004'
форматирование поплавков, обрабатывается только одна функция float_repr
в Python 3 (у него нет специального
именно так python (и многие другие языки) справляются с неточностью с плавающей точкой. Таким образом, внутренне это число фактически равно 0.3. Есть сайт, посвященный этой проблеме на многих языках: http://0.30000000000000004.com/
для этой конкретной печати вы можете просто процитировать число (сделать его строкой), и компилятор не будет пытаться округлить число:
print "{}".format("0.3000000000004")
но тогда вам также не нужно будет использовать формат:
print "0.3000000000004"