为什么在Python中对浮点数进行舍入时会发生这种情况?

为什么在Python中对浮点数进行舍入时会发生这种情况?,python,floating-accuracy,Python,Floating Accuracy,我正在研究Python中的浮点数舍入,以下行为似乎很奇怪: 代码: 输出: 为什么第一种情况,尤其是第二种情况会失败?我不知道为什么这些情况不能按预期工作的具体细节,但是如果您希望浮点数具有严格的准确性,请使用类似的方法。没有失败。看 一半到一半 不太偏袒的打破平局规则是从一半到一半,即: 如果y的分数是0.5,那么q是最接近y的偶数整数。 因此,例如,+23.5变为+24,就像+24.5一样;虽然−23.5 变成−24,我也是−24.5 该方法对称地处理正值和负值,并且 因此没有符号偏差。更重

我正在研究Python中的浮点数舍入,以下行为似乎很奇怪:

代码:

输出:


为什么第一种情况,尤其是第二种情况会失败?

我不知道为什么这些情况不能按预期工作的具体细节,但是如果您希望浮点数具有严格的准确性,请使用类似的方法。

没有失败。看

一半到一半 不太偏袒的打破平局规则是从一半到一半,即:

如果y的分数是0.5,那么q是最接近y的偶数整数。 因此,例如,+23.5变为+24,就像+24.5一样;虽然−23.5 变成−24,我也是−24.5

该方法对称地处理正值和负值,并且 因此没有符号偏差。更重要的是,为了合理 y值的分布,四舍五入 数字与原始数字相同。但是, 该规则将为偶数引入一个接近零的偏差,以及一个 对于奇数的偏向无穷大

这种四舍五入到最近法的变体也称为无偏法 舍入,收敛舍入,统计学家舍入,荷兰语 舍入、高斯舍入、奇偶舍入或银行家舍入 四舍五入,广泛用于簿记

这是IEEE 754计算函数中使用的默认舍入模式 和操作员

所以真正的问题应该是为什么第三个案例失败了

203.25可以用浮点表示法精确表示,但是0.1不能,它比0.1稍微多一点


所以它被四舍五入这可能是答案的一部分:

>>> a*.1
20.325000000000003
>>> a/10
20.325

请参阅@gnibblers关于如何实现IEEE 754舍入的说明。

您可以使用printf查看发生了什么

 print '%0.20f'%20.325
 20.32499999999999928946
的Python文档指向了答案。基本上是浮点数。例如,0.1最终看起来像0.100000000000001。这种不精确有时会导致意外的结果。用浮点数在给定的公差范围内进行计算是非常困难的。在你的例子中,0.1*a的计算之所以有效,是因为它在你想要的舍入方向上有轻微的偏差

如果您确实需要精确性,您应该考虑使用。使用十进制数也可能是一件烦琐的事情,但它确实使您更容易获得所需的精度

>>> "%.2f"%20.325
'20.32'
>>> "%.2f"%20.335
'20.34'
>>> "%.2f"%20.345
'20.34'
>>> "%.2f"%20.355
'20.36'
>>> 0.1*203.25
20.325000000000003
>>> a*.1
20.325000000000003
>>> a/10
20.325
 print '%0.20f'%20.325
 20.32499999999999928946