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に等しいのですか?
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に等しいのですか?
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
この精度が必要な場合は、タイプを使用してください。