9

これを見てください:

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

以下を出力します。

345.0
345
344

他の2つの出力が示唆するように、私は次々に等しいと期待345していたので、最後の行がであると期待していました。ただし、これは明らかにそうではありません。ここで何が起こっているのかについて誰かが私に洞察を与えることができますか?int(41063625 ** (1.0/3))int(345.0)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と、345ではなく344になります。

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

345.0 ではないため41063625 ** (1.0/3):

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 に答える