2016-08-03 46 views
-3

有人可以解釋我爲什麼我沒有得到166.9(我知道有一個round()函數)我只是想了解。 :)Python3奇怪的浮動舍入

>>> 165.0 + 1.45 + 0.45 
166.89999999999998 
+6

因爲[浮點運算被打破(http://stackoverflow.com/q/588004/5647260) – Li357

+0

@JonathonReinhart我做到了,因此您的評論 – Li357

+0

的upvotes @JonathonReinhart這真的很奇怪,我的標誌選項是灰色的所以我肯定標記爲重複 – Li357

回答

0

這是因爲在計算機中數字以二進制形式表示。這不僅僅是Python的問題,而是一般的電腦問題。

+0

我的2€calc可以處理這個計算...並且這個simpe c程序找到了正確的答案:#include int main() { printf(「%f \ n」,165.0 + 1.45 + 0.45); return 0; } – hanoo

+0

是的,自然。查看有關此主題的鏈接。簡而言之,您的計算器在內部也有二進制形式的數字,並且具有像內部代表的例如1.45的數字。爲1.4499999999999999999。但他沒有太多地方向你展示他的內部號碼,他將它圍繞並在顯示器上顯示1.45。但是計算機在內存上有更多的空間,他不會爲你整理它,所以如果沒有必要的話,他的二進制形式的準確性更高,並且不會對它進行調整。矛盾的是,更便宜的設備,它似乎對我們來說更加準確,但內部卻不是。 –

+0

你的例子很好,但是你必須知道,''%f \ n「'意味着什麼格式。試試這個格式爲'「%.30f \ n」'。它將有三十個小數點。結果是:166.899999999999977262632455676794。整個程序:'#include int main(){printf(「%。30f \ n」,165.0 + 1.45 + 0.45);返回0; }' –

0

浮點數在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