9

Pythonの//「整数除法」演算子は、今日私を驚かせました。

>>> math.floor(11/1.1)
10.0
>>> 11//1.1
9.0

ドキュメントには、「(床の)xとyの商」と書かれています。では、なぜmath.floor(11 / 1.1)は10に等しいのに、11 // 1.1は9に等しいのですか?

4

1 に答える 1

6

1.1はバイナリ形式で正確に表現できないためです。近似値は1.1より少し高いため、除算の結果は少し小さすぎます。

次のことを試してください。

Python 2では、コンソールで次のように入力します。

>>> 1.1
1.1000000000000001

Python 3.1では、コンソールにが表示されます1.1が、内部的には同じ番号のままです。

だが:

>>> 11/1.1
10.0

gnibblerが指摘しているように、これはフロートの利用可能な精度制限内での「内部丸め」の結果です。そして、MYYNが彼のコメントで指摘しているように、可能な限り保存するためと//は異なるアルゴリズムを使用して床分割結果を計算します。math.floor()a == (a//b)*b + a%b

Decimalこの精度が必要な場合は、タイプを使用してください。

于 2010-01-07T10:36:04.763 に答える