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)
为什么第一个,特别是第二个案例失败了?
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)
所以它被四舍五入
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |