Python奇怪的int行为

Python奇怪的int行为,python,int,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,正如其他两个输出所示。然而,情况显然并非如此。有人能告诉我这里发生了什么吗?打印(或者更确切地说是float.\uu s

看看这个:

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
,正如其他两个输出所示。然而,情况显然并非如此。有人能告诉我这里发生了什么吗?

打印(或者更确切地说是
float.\uu str\uu
)正在对输出进行取整

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
因为
41063625**(1.0/3)
不是345.0:

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

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

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

>>> 41063625 ** (1.0/3)
344.9999999999999
>>> int(345.0)
345
>>> int(41063625 ** (1.0/3))
344
所以得到344是绝对正确的。浮点数的内部表示缺乏一定的准确性,因此转换为
int
将始终给出下限值


您可以使用该函数来获得更合理的值。

啊,好吧,这很有意义-我不知道像这样进行取整是
打印的一个功能。谢谢张贴
str(41063625**(1.0/3))
的输出可能是说明性的,因为这就是
print
实际打印的内容。@A.R.S.:在3.2+
float中。uu str\uuuu
使用
repr
,它使用最小位数取整到原始的float。例如:
print(41063625**(1.0/3))
outputs
344.99999999999