如何最好地处理这个Python数字错误?

Joa*_*nge 2 python math floating-point

我有这个代码抛出math domain error异常:

v = -1.0

for i in range (201):
    print acos (v)
    v += 0.01
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其更改为此,它的工作原理如下:

v = -100

for i in range (201):
    print acos (v / 100.0)
    v += 1
Run Code Online (Sandbox Code Playgroud)

这是因为四舍五入吗?

如何在Python中最好地解决这个问题?或者我应该像上一个例子那样做?

JBe*_*rdo 8

如果你这样做:

>>> format(0.01, '.30f')
'0.010000000000000000208166817117'
Run Code Online (Sandbox Code Playgroud)

你可以看到0.01(作为双精度的浮点数)大于0.01你在学校学到的数字.

所以,当你总结100次时,误差会变大:

>>> sum([0.01]*100)
1.0000000000000007
Run Code Online (Sandbox Code Playgroud)

这足以给出数学域错误.

你能做什么?

  • 使用第二个代码
  • round() 它减少小数点:

.

>>> round(1.0000000000000007, 13)
1.0
Run Code Online (Sandbox Code Playgroud)

13或14可能就足够了.