На самом деле, .format()
округляет последовательно - только не так, как можно было бы ожидать.
IEEE floating point standard определяет два разных способа округления до ближайших номеров. Вы ждете, чтобы идти от нуля:
2.5 rounds to 3.0
1.5 rounds to 2.0
0.5 rounds to 1.0
-0.5 rounds to -1.0
-1.5 rounds to -2.0
Другой способ заключается в округлить до четные номера:
2.5 rounds to 2.0
1.5 rounds to 2.0
0.5 rounds to 0.0
-0.5 rounds to -0.0 (yes, this is different from 0)
-1.5 rounds to -2.0
Этот метод является объективной, в том смысле, что сумма/средняя округленных чисел, скорее всего, будет соответствовать сумме/среднему числу исходных чисел. Вот почему IEEE рекомендует это как правило по умолчанию для округления.
Реализация округления варьируется от функции к функции, версии к версии. Вот таблица, как различные выражения круглые:
x 2.5 1.5 0.5 -0.5 -1.5
round(x) in Py 2.x away 3.0 2.0 1.0 -1.0 -2.0
round(x) in Py 3.x even 2.0 2.0 0.0 -0.0 -2.0 Changed behaviour
'{:.0f}'.format(x) even 2 2 0 -0 -2
'%.0f' % x even 2 2 0 -0 -2
numpy.around(x) even 2.0 2.0 0.0 0.0 -2.0
Также см dawg's answer о том, как вы можете выбрать свое поведение округление с помощью Decimal module. И John La Rooy has answered a similar question
Бит клоджа, но вы можете вручную 'round' first:' format (round (2.5), ', .0f') 'дает' '3''. – jonrsharpe
представление этих значений может быть не «согласованным» в том, как вы ожидаете. – Skaperen
Здесь обсуждается множество способов, которые могут помочь. Хотя большинство из них требуют использования другой функции, отличной от «формата», которую вы уже используете, - http://stackoverflow.com/questions/4518641/how-to-round-off-a-floating-number-in-python – fixxxer