結果変数の値は9.0になります。なぜ "%d"を使用して印刷すると、8が返されますか? %d
floatをintにキャストすると不正な値になる
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が返されますか? %d
floatをintにキャストすると不正な値になる
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で表示される値を意味している二元系で小数点表現を浮動8.
得る内部にまで切り詰め9未満とことであった理由である、あなたの値を切り捨て例えば8
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
This Wikipeadia物品がそう提供これらの収量の全て浮動小数点表示に関する追加の背景。
浮動小数点演算は本質的に不正確です。 Python計算では、通常、倍精度に計算が実行されます。あなたの数値は倍精度に正確に表現できないので、丸め誤差の影響を受けます。私のマシンではresult
は8.9999999999999929
です。
>>> result = (((1.7526 % 0.3048)/0.3048) * 12)
>>> result
8.9999999999999929
>>> print result
9.0
>>> int(result)
8
あなたはそれが9.0
に丸められます値、未満9.0
にresult
に保存されている実際の値を印刷します。したがって、result
を整数に変換すると、8
に切り捨てられます。
重要な問題は値の表現可能性です。 1.7526
も0.3048
も、Pythonインタプリタで簡単に見られるように、倍精度で正確に表現できません。
>>> 1.7526
1.7525999999999999
>>> 0.3048
0.30480000000000002
ストーリーの道徳は、浮動小数点値を使用するときに正確な算術演算を期待するべきではないということです。このトピックについての具体的な議論は、What Every Computer Scientist Should Know About Floating-Point Arithmeticです。