Python奇怪的int行为

ars*_*jii 9 python int

看看这个:

print 41063625 ** (1.0/3)  # cube-root(41063625) = 345
print int(345.0)
print int(41063625 ** (1.0/3))
Run Code Online (Sandbox Code Playgroud)

它输出:

345.0
345
344
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 12

打印(或更确切地说float.__str__)是对输出进行舍入.

In [22]: str( 41063625 ** (1.0/3) )
Out[22]: '345.0'
Run Code Online (Sandbox Code Playgroud)

浮点表示 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
Run Code Online (Sandbox Code Playgroud)

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

In [18]: round(41063625 ** (1.0/3))
Out[18]: 345.0
Run Code Online (Sandbox Code Playgroud)

或者,得到一个int:

In [19]: int(round(41063625 ** (1.0/3)))
Out[19]: 345
Run Code Online (Sandbox Code Playgroud)

  • @ARS:在3.2 +`float .__ str__`中使用`repr`,它使用最小位数来回绕原始浮点数.例如:`print(41063625**(1.0/3))`输出`344.9999999999999`. (2认同)