我在这里遇到了一些奇怪的情况,我很茫然——我有一种感觉,这与浮点精度有关,但是我很惊讶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
现在我开始想我应该早就知道这是罪魁祸首。在
整数转换将只删除小数点后的任何内容,因此即使您有344.9999999989,它也将始终向下舍入。 你可以用老式的印刷品%
^{pr2}$如果你想要一个整数,你可以用round
^{3}$另外,您可能对立方体根问题的其他解决方案感兴趣 here
这是使用
c.__str__()
(又名。str(c)
):这是使用
^{pr2}$c.__repr__()
(又名。repr(c)
):IIRC,}则更进一步。要获得与Python shell中相同的行为,可以执行以下操作:
^{3}$__str__
截断为10位小数,而{您在消息中所说的更改只是关于Python3.1,并且不会改变输出的精度:在Python3.1中,用于浮点数上的
__repr__
的Gay算法将在给定两个产生相同浮点值的表示选项(如0.2
和0.2000000000000001
)时,选择最短的一个。在相关问题 更多 >
编程相关推荐