有人可以解釋我爲什麼我沒有得到166.9(我知道有一個round()函數)我只是想了解。 :)Python3奇怪的浮動舍入
>>> 165.0 + 1.45 + 0.45
166.89999999999998
有人可以解釋我爲什麼我沒有得到166.9(我知道有一個round()函數)我只是想了解。 :)Python3奇怪的浮動舍入
>>> 165.0 + 1.45 + 0.45
166.89999999999998
這是因爲在計算機中數字以二進制形式表示。這不僅僅是Python的問題,而是一般的電腦問題。
我的2€calc可以處理這個計算...並且這個simpe c程序找到了正確的答案:#include
是的,自然。查看有關此主題的鏈接。簡而言之,您的計算器在內部也有二進制形式的數字,並且具有像內部代表的例如1.45的數字。爲1.4499999999999999999。但他沒有太多地方向你展示他的內部號碼,他將它圍繞並在顯示器上顯示1.45。但是計算機在內存上有更多的空間,他不會爲你整理它,所以如果沒有必要的話,他的二進制形式的準確性更高,並且不會對它進行調整。矛盾的是,更便宜的設備,它似乎對我們來說更加準確,但內部卻不是。 –
你的例子很好,但是你必須知道,''%f \ n「'意味着什麼格式。試試這個格式爲'「%.30f \ n」'。它將有三十個小數點。結果是:166.899999999999977262632455676794。整個程序:'#include
浮點數在python中存儲在64位。 1位是符號,52位是尾數,11位是指數。要從這3個組件得到小數值,計算機將做*尾數* 2 ^指數。
並非所有的數字都可以完美地存儲在這個表單中。只有52位來存儲號碼。例如,11.3不能完美地存儲在這個表單中,你可以看到這個數字的確切值。
from decimal import Decimal
print(Decimal(11.3))
當您添加165.0 + 1.45 + 0.45。
>>> print(Decimal(165))
165
>>> print(Decimal(1.45))
1.4499999999999999555910790149937383830547332763671875
>>> print(Decimal(0.45))
0.450000000000000011102230246251565404236316680908203125
你實際上並沒有添加這些確切的值。
有關浮點數系統的更多信息,請訪問Wikipedia。
因爲[浮點運算被打破(http://stackoverflow.com/q/588004/5647260) – Li357
@JonathonReinhart我做到了,因此您的評論 – Li357
的upvotes @JonathonReinhart這真的很奇怪,我的標誌選項是灰色的所以我肯定標記爲重複 – Li357