这个数字有没有Python没有显示的精度?

2024-05-23 13:41:03 发布

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

我在这里遇到了一些奇怪的情况,我很茫然——我有一种感觉,这与浮点精度有关,但是我很惊讶Python不会显示近似误差,如果是这样的话。在

我正在处理Project Euler problem 62。作为一个简单的测试(后来我用另一种方法解决了这个问题),我有一个is_cube,我打算检查一个数字立方体是否完美。所以,为了尝试给定的样本,我做了以下工作:

def is_cube(i):
    c = i ** (1./3)
    print "c is", c

当我用I=41063625运行这个程序时,预期的输出是:

^{pr2}$

以下是意外发生的地方:

def is_cube(i):
    c = i ** (1./3)
    print "c is", int(c)

突然间,我有了这个:

c is 344

c不能与我的345.0文本进行比较,或者--c < 345.0为真。在

这个数字有没有Python没有显示的精度?我好像记得我读过一篇关于修改浮动的文章,使其在打印时显得更加理智;是这样吗?这两个案子有什么不同?在

>>> def is_cube(i):
...     c = i ** (1./3)
...     print "c is", c
... 
>>> is_cube(41063625)
c is 345.0
>>> 41063625 ** (1./3)
344.99999999999989

编辑:仍然打开窗口并执行以下操作:

>>> print _
345.0

现在我开始想我应该早就知道这是罪魁祸首。在


Tags: 方法projectisdef情况精度数字误差
2条回答
    print "c is", int(c)

整数转换将只删除小数点后的任何内容,因此即使您有344.9999999989,它也将始终向下舍入。 你可以用老式的印刷品%

^{pr2}$

如果你想要一个整数,你可以用round

^{3}$

另外,您可能对立方体根问题的其他解决方案感兴趣 here

这是使用c.__str__()(又名。str(c)):

print "c is", c

这是使用c.__repr__()(又名。repr(c)):

^{pr2}$

IIRC,__str__截断为10位小数,而{}则更进一步。要获得与Python shell中相同的行为,可以执行以下操作:

^{3}$

您在消息中所说的更改只是关于Python3.1,并且不会改变输出的精度:在Python3.1中,用于浮点数上的__repr__的Gay算法将在给定两个产生相同浮点值的表示选项(如0.20.2000000000000001)时,选择最短的一个。在

相关问题 更多 >