2

結果変数は値 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
4

2 に答える 2

5

浮動小数点演算は本質的に不正確です。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.75260.3048正確に倍精度で表現できません。

>>> 1.7526
1.7525999999999999
>>> 0.3048
0.30480000000000002

この話の教訓は、浮動小数点値を使用するときに正確な計算を期待するべきではないということです。このトピックの重要な議論は、「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」です。

于 2012-05-13T18:44:31.150 に答える
1

%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

このウィキペディアの記事は、浮動小数点表現に関する追加の背景を提供します。

于 2012-05-13T18:43:59.440 に答える