結果變量將保留值9.0。爲什麼然後當我使用「%d」打印時打印返回8?將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?將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
的%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
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
值,而是存儲在result
不到9.0
實際值。因此,當您將result
轉換爲整數時,它會被截斷爲8
。
關鍵問題是值的可表示性。在Python解釋器中很容易看到1.7526
和0.3048
都不能精確表示爲雙精度。
>>> 1.7526
1.7525999999999999
>>> 0.3048
0.30480000000000002
故事的寓意在於,當使用浮點值時,您不應該期待精確的算術。這個主題的開創性討論是:What Every Computer Scientist Should Know About Floating-Point Arithmetic。