数学结果应该是零,但与直接替换相比有点偏差

2024-04-18 03:52:59 发布

您现在位置:Python中文网/ 问答频道 /正文

更新:谢谢,伙计们,我不知道这是非常接近零,但不完全是零。有没有办法让我的程序把它看成是零?因为这个值不是零,所以我的结果被丢弃了。 更新2:找到答案,添加:

from decimal import *
getcontext().prec = 6

然后十进制(数字)固定谢谢。谢谢所有人!你知道吗

我正在运行一段简单的代码,但是得到了一个带有特定数字的奇怪结果。这有点奇怪,因为当我在python终端中运行同一个命令时,我得到了预期的结果。你知道吗

我做了print语句,命令正在运行,这样我就可以在解释器(python2.7)中复制/粘贴它,看看结果是否相同。程序如下:

x = 20
for s in range(100 + 1): 
    for c in range(100+1):
        if s == 7:
            print s, '-', (c*0.01), '*', x, ' = ', (s - (c*0.01) * x)

结果看起来不错,除了一个:

7 - 0.33 * 20  =  0.4
7 - 0.34 * 20  =  0.2
7 - 0.35 * 20  =  -8.881784197e-16
7 - 0.36 * 20  =  -0.2
7 - 0.37 * 20  =  -0.4

当我复制/粘贴7 - 0.35 * 20到解释器中时,我得到了0.0,这是我所期望的(程序中的其他结果似乎很好,除了7-0.35*20和(未显示)与14相似的值。你知道吗

我有点不知所措,我不知道这是怎么回事。你知道吗


Tags: 答案infromimport命令程序for粘贴
3条回答

您已经发现了(ieee754)浮点数学的不精确性。计算的结果非常接近于零,但不完全是零,因为微处理器通常以牺牲精度的方式进行浮点运算,以换取速度和紧凑存储等其他好处。你知道吗

如何打印这个非常接近于零的值可能取决于非交互地使用哪个版本的Python(这也是2.7吗?)。你知道吗

Unfortunately, most decimal fractions cannot be represented exactly as binary fractions. A consequence is that, in general, the decimal floating-point numbers you enter are only approximated by the binary floating-point numbers actually stored in the machine.

Floating Point Arithmetic: Issues and Limitations

交互式解释器的输出和您的程序之间没有区别,但是您给它的输入是不同的。观察:

>>> print 7 - 0.35 * 20
0.0
>>> print 7 - 35 * 0.01 * 20
-8.881784197e-16

正如其他人已经指出的,这是由于舍入误差造成的。你知道吗

相关问题 更多 >