2015-04-16 3 views
1

В Python Я использую строку формата для разделения запятой и округления. Но округление несовместимо. Например,Строка форматирования строк не соответствует

>>> '{:,.0f}'.format(1.5) 
'2' # Here it is increasing to next integer 
>>> '{:,.0f}'.format(2.5) 
'2' # Here it is suppose to give 3 as per the earlier logic. 

Это зависит от числа до десятичной точки. Если он четный, то Python округляется, увеличивая целочисленное значение, а наоборот - для нечетных чисел.

Может кто-то помочь мне в получении последовательного округления для всех чисел

+0

Бит клоджа, но вы можете вручную 'round' first:' format (round (2.5), ', .0f') 'дает' '3''. – jonrsharpe

+0

представление этих значений может быть не «согласованным» в том, как вы ожидаете. – Skaperen

+0

Здесь обсуждается множество способов, которые могут помочь. Хотя большинство из них требуют использования другой функции, отличной от «формата», которую вы уже используете, - http://stackoverflow.com/questions/4518641/how-to-round-off-a-floating-number-in-python – fixxxer

ответ

2

На самом деле, .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

0

числа с плавающей точкой может быть немного варьироваться, которые непредсказуемы, такими как 1,5 может быть 1,4999999 или 1,5000001. Таким образом, вы не можете ожидать того же результата для .5 резких значений.

В этом случае он имеет много способа решить такие как добавить небольшое количество к ней, как 0,0001

Смежные вопросы