在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 :(得分:3)
实际上,.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一个similar question
答案 1 :(得分:0)
浮点数可能有点变化,不可预测,例如1.5可能是1.4999999或1.5000001。所以你不能期望.5锐利值的结果相同。
在这种情况下,它有很多方法可以解决,例如像0.0001
那样添加一个小数字