9

看看这个:

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))equal int(345.0)to 反过来 equal 345,正如其他两个输出所暗示的那样。然而,显然情况并非如此。谁能告诉我这里发生了什么?

4

3 回答 3

12

Print(或者更确切地说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
于 2012-11-10T13:55:44.597 回答
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
于 2012-11-10T13:56:51.650 回答
0

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

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

所以得到 344 是绝对正确的。浮点数的内部表示缺乏一定的准确性,因此转换为int总是会给出下限值。

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

于 2012-11-10T13:59:25.653 回答