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

fot*_*tis 0 python floating-accuracy

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

代码:

a = 203.25
print '%.2f'%(a/10.)
print '%.2f'%(round(a/10., 2))
print '%.2f'%(0.1*a)
Run Code Online (Sandbox Code Playgroud)

输出:

20.32
20.32
20.33
Run Code Online (Sandbox Code Playgroud)

为什么第一个,特别是第二个案例失败了?

Joh*_*ooy 7

http://en.wikipedia.org/wiki/Rounding#Round_half_to_even

圆形的一半甚至是
一个较少偏见的平局规则是半圆到均匀,即:

如果y的分数是0.5,则q是最接近y的偶数.因此,例如,+ 23.5变为+24,+ 24.5也变为+24; 而-23.5变为-24,-24.5变为-24.5.

该方法对称地处理正值和负值,因此没有符号偏差.更重要的是,对于y值的合理分布,舍入数的预期(平均)值与原始数的相同.然而,这条规则将为偶数引入偏零偏差,对奇数偏差引入偏无穷大偏差.

圆形到最近方法的这种变体也称为无偏舍入,收敛舍入,统计学舍入,荷兰舍入,高斯舍入,奇偶舍入银行家舍入,并且广泛用于簿记.

这是IEEE 754计算功能和运算符中使用的默认舍入模式.

>>> "%.2f"%20.325
'20.32'
>>> "%.2f"%20.335
'20.34'
>>> "%.2f"%20.345
'20.34'
>>> "%.2f"%20.355
'20.36'
Run Code Online (Sandbox Code Playgroud)

所以真正的问题应该是为什么第三种情况会失败?

203.25可以用浮点表示精确表示,但是0.1不能,它结果是一点点0.1

>>> 0.1*203.25
20.325000000000003
Run Code Online (Sandbox Code Playgroud)

所以它被四舍五入