一尘不染

浮点数的Python舍入错误

python

我不知道这是否是一个明显的错误,但是在运行Python脚本以更改模拟参数时,我意识到缺少delta = 0.29delta = 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返回float(29)/ 100为0.28999999999999998。但这不是系统错误,从某种意义上说,它并不是每个整数都发生的。因此,我创建了以下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

而且我看不到发生这种舍入错误的数字中的任何模式。为什么这些特定数字会发生这种情况?


阅读 350

收藏
2020-02-11

共1个答案

一尘不染

不能由精确的2的幂构成的任何数字都不能完全表示为浮点数。它需要被近似。有时最接近的近似值会小于实际数字。

2020-02-11