看看这个:
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
,正如其他两个输出所暗示的那样。但是,显然情况并非如此。谁能给我任何关于这里发生了什么的见解?
答案 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()
功能获得更合理的价值。