Округление формата 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"