基本减法中的Python错误?

got*_*ube 11 python arithmetic-expressions subtraction

可能重复:
Python舍入错误与浮点数
python数学是错误的

我不能让Python正确地做减法1 - 0.8并分配它.它一直提出错误的答案,0.19999999999999996.

我探讨了一下:

sq = {}
sub = {}
for i in range(1000):
    sq[str(i/1000.)+'**2']=((i/1000.)**2)
    sub['1-'+str(i/1000.)]=(1.0-(i/1000.))
Run Code Online (Sandbox Code Playgroud)

并发现这个错误发生在0到1到第三个小数位之间的一个随机的浮点组.当您对这些浮点数进行平方时,也会发生类似的错误,但会出现类似的错误.

我希望对此有一个解释,以及如何使Python正确运算.使用round(x,3)是我现在使用的解决方法,但它并不优雅.

谢谢!

这是我的Python 2.7.3 shell中的一个会话:

*** Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32. ***
*** Remote Python engine  is active ***
>>> 1-0.8
0.19999999999999996
>>> print 1-0.8
0.2
>>> a = 1-0.8
>>> a
0.19999999999999996
>>> print a
0.2
>>> a = 0.2
>>> print a
0.2
>>> a
0.2
>>> 
Run Code Online (Sandbox Code Playgroud)

这是我在几个在线口译中输入的代码:

def doit():
    d = {'a':1-0.8}
    return d

print doit()
Run Code Online (Sandbox Code Playgroud)

和输出:

{'a': 0.19999999999999996}
Run Code Online (Sandbox Code Playgroud)

Bur*_*lid 11

使用Decimal它的设计就是为了这个:

>>> from decimal import Decimal, getcontext
>>> Decimal(1) - Decimal(0.8)
Decimal('0.1999999999999999555910790150')
>>> getcontext().prec = 3
>>> Decimal(1) - Decimal(0.8)
Decimal('0.200')
>>> float(Decimal(1) - Decimal(0.8))
0.2
Run Code Online (Sandbox Code Playgroud)

  • 为什么要输入浮点数?因此,第一个减法与 OP 具​​有相同的问题。使用字符串代替:`Decimal(1) - Decimal('0.8')` -> `Decimal('0.2')` (2认同)

mpe*_*kov 9

浮动数字不会像您期望的那样工作.

对于初学者,请阅读浮点指南.简而言之:计算机将浮点数表示为二进制,事实证明存储精确的小数部分是不可能的(在纸上试一试,看看为什么).出于实用目的,0.19999999999999996与"足够接近"为0.2.如果你想将它打印为0.2,那么你可以做类似的事情:

print "%0.1f" % floating_point_value
Run Code Online (Sandbox Code Playgroud)

所以你所看到的不是错误.这是预期的行为.