Python浮点数舍入错误

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

我看不出数字中会出现舍入错误的任何模式。为什么这些特定的数字会出现这种情况呢?


小怪兽爱吃肉
浏览 649回答 2
2回答

暮色呼如

任何不能由二的精确幂构成的数字都不能精确地表示为浮点数;它需要近似。有时,最接近的近似值将小于实际数。朗读,阅读关于浮点算法,每个计算机科学家都应该知道些什么?.

炎炎设计

这是众所周知的,因为它的性质浮点数.如果您想做十进制算术,而不是浮点算术,则有图书馆做这件事。例如,>>> 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另一种选择是使用分馏不是近似的图书馆。(它只是在必要时不断加/减和乘以整数分子和分母)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python