格式字符串舍入不一致

2024-06-10 19:33:39 发布

您现在位置:Python中文网/ 问答频道 /正文

在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将通过增加整数值进行舍入,对于奇数则相反。在

有人能帮我把所有数字都修约一致吗


Tags: to字符串formathereisas格式it
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

另一种方法是四舍五入到偶数:

^{pr2}$

这种方法是无偏的,因为四舍五入的数字的总和/平均值更有可能与原始数字的总和/平均值相匹配。这就是为什么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 answeredasimilar question

浮点数可能会有一点变化,不可预测的,如1.5可能是1.499999或1.5000001。所以你不能期望0.5个锐利值的结果是一样的。在

在这种情况下,有很多方法可以解决,比如加一个像0.0001这样的小数值

相关问题 更多 >