为了账号安全,请及时绑定邮箱和手机立即绑定

Python浮点数舍入错误

Python浮点数舍入错误

小怪兽爱吃肉 2019-06-17 14:53:34
Python浮点数舍入错误我不知道这是否是一个明显的错误,但是当运行Python脚本来改变模拟的参数时,我意识到Delta=0.29和Delta=0.58的结果丢失了。在调查时,我注意到以下Python代码:for i_delta in range(0, 101, 1):   delta = float(i_delta) / 100   (...)filename = 'foo' + str(int(delta * 100)) + '.dat'为增量=0.28和0.29生成相同的文件,与.57和.58相同,原因是python以0.28999999999999998的形式返回Float(29)/100。但这并不是一个系统性的错误,并不是每个整数都会发生这种情况。因此,我创建了以下Python脚本:import sys n = int(sys.argv[1])for i in range(0, n + 1):   a = int(100 * (float(i) / 100))   if i != a: print i, a我看不出数字中会出现舍入错误的任何模式。为什么这些特定的数字会出现这种情况呢?
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

任何不能由二的精确幂构成的数字都不能精确地表示为浮点数;它需要近似。有时,最接近的近似值将小于实际数。

朗读,阅读关于浮点算法,每个计算机科学家都应该知道些什么?.


查看完整回答
反对 回复 2019-06-17
?
炎炎设计

TA贡献1808条经验 获得超4个赞

这是众所周知的,因为它的性质浮点数.

如果您想做十进制算术,而不是浮点算术,则有图书馆做这件事。

例如,

>>> from decimal import Decimal>>> Decimal(29)/Decimal(100)Decimal('0.29')>>> Decimal('0.29')*100Decimal('29')>>> int(Decimal('29'))29

一般说来,小数点可能有点过头了,在很少的情况下,当数字没有有限的十进制表示时,仍然会有舍入误差(例如,分母不为1或分母不可除以2或5的任何分数-小数基数(10)的因子)。例如:

>>> s = Decimal(7)>>> Decimal(1)/s/s/s/s/s/s/s*s*s*s*s*s*s*sDecimal('0.9999999999999999999999999996')>>> 
int(Decimal('0.9999999999999999999999999996'))0

所以,最好在把浮点数投到INT之前一直绕一圈,除非你想要一个地板函数。

>>> int(1.9999)1>>> int(round(1.999))2

另一种选择是使用分馏不是近似的图书馆。(它只是在必要时不断加/减和乘以整数分子和分母)。


查看完整回答
反对 回复 2019-06-17
  • 2 回答
  • 0 关注
  • 607 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信