Python奇怪的int行为

时间:2012-11-10 13:53:16

标签: python int

看看这个:

print 41063625 ** (1.0/3)  # cube-root(41063625) = 345
print int(345.0)
print int(41063625 ** (1.0/3))

输出:

345.0
345
344

我希望最后一行是345,因为我希望int(41063625 ** (1.0/3))等于int(345.0)依次等于345,正如其他两个输出所暗示的那样。但是,显然情况并非如此。谁能给我任何关于这里发生了什么的见解?

3 个答案:

答案 0 :(得分:12)

打印(或更确切地说float.__str__)将输出四舍五入。

In [22]: str( 41063625 ** (1.0/3) )
Out[22]: '345.0'

浮点表示 41063625 ** (1.0/3)小于345,所以当你取int时,你会得到344而不是345。

In [15]: 41063625 ** (1.0/3)
Out[15]: 344.9999999999999

In [16]: int(345.0)
Out[16]: 345

In [17]: int(41063625 ** (1.0/3))
Out[17]: 344

如果你想要最接近的int,你可以使用round:

In [18]: round(41063625 ** (1.0/3))
Out[18]: 345.0

或者,获得int

In [19]: int(round(41063625 ** (1.0/3)))
Out[19]: 345

答案 1 :(得分:1)

因为41063625 ** (1.0/3)不是345.0:

In [7]: 41063625 ** (1.0/3)
Out[7]: 344.9999999999999

In [8]: int(344.9999999999999)
Out[8]: 344

答案 2 :(得分:0)

嗯,我从计算中得到的是这样的:

>>> 41063625 ** (1.0/3)
344.9999999999999
>>> int(345.0)
345
>>> int(41063625 ** (1.0/3))
344

所以获得344是绝对正确的。浮点数的内部表示缺乏一定的准确性,因此转换为int将始终给出底值。

您可以使用round()功能获得更合理的价值。