結果変数は値 9.0 を保持します。「%d」を使用して印刷すると、印刷が 8 を返すのはなぜですか?
result = (((1.7526 % 0.3048) / 0.3048) * 12)
print(result) #prints 9.0
print("%f" % result) #prints 9.0
print("%d" % result) #prints 8
結果変数は値 9.0 を保持します。「%d」を使用して印刷すると、印刷が 8 を返すのはなぜですか?
result = (((1.7526 % 0.3048) / 0.3048) * 12)
print(result) #prints 9.0
print("%f" % result) #prints 9.0
print("%d" % result) #prints 8
浮動小数点演算は本質的に不正確です。Python では、通常、計算は倍精度で実行されます。数値は倍精度で正確に表現できないため、丸め誤差が発生する可能性があります。私のマシンでは、result
です8.9999999999999929
。
>>> result = (((1.7526 % 0.3048) / 0.3048) * 12)
>>> result
8.9999999999999929
>>> print result
9.0
>>> int(result)
8
値を出力すると、 に丸められます9.0
が、実際の値result
は 未満に格納され9.0
ます。したがって、result
整数に変換すると、 に切り捨てられ8
ます。
重要な問題は、値の表現可能性です。Python インタープリターで簡単にわかるように、どちら1.7526
も0.3048
正確に倍精度で表現できません。
>>> 1.7526
1.7525999999999999
>>> 0.3048
0.30480000000000002
この話の教訓は、浮動小数点値を使用するときに正確な計算を期待するべきではないということです。このトピックの重要な議論は、「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」です。
は%d
値を切り捨てます。これが 8 を取得する理由です。
バイナリ システムでの浮動小数点表現は、9.0 で表示された値が内部的に 9 未満であったため、8 に切り捨てられたことを意味する近似値です。
たとえば、これらはすべて 3 になります。
In [19]: i = 3.1
In [20]: print '%d' %i
3
In [21]: i = 3.4
In [22]: print '%d' %i
3
In [23]: i = 3.7
In [24]: print '%d' %i
3
In [25]: i = 3.9999
In [26]: print '%d' %i
3
このウィキペディアの記事は、浮動小数点表現に関する追加の背景を提供します。