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