讓我們回想一下小學的數學知識, 在十進制中, 如果要用有限小數來表示一個分數的值, 那么這個分數的分母(化簡之后)一定不能包含除了2和5以外的其他質因數, 因為十進制以10來分割數軸, 而10分解質因數的結果為2×5 。 舉個例子:1/8、1/10、1/25都可以換算成有限小數(分別是0.125、0.1、0.04), 因為這些分數的分母分解質因數之后只包含2或者5(8=2×2×2、10=2×5、25=5×5), 而當分母包含其他質因數時, 例如1/3、1/7、1/18這些則無法用有限小數來表示(也就是俗話說的“除不盡”) 。 如果我們把這個規律套用到二進制上會怎么樣呢?2本身就是一個質數, 無法分解質因數了, 因此在二進制中, 如果要用有限小數來表示一個分數的值, 那么這個分數的分母一定只能包含2這一個質因數, 換句話說, 分母必須為2的冪(2、4、8、16、32……) 。
好了, 我們回頭看看開頭的題目, 0.1換算成分數就是1/10, 而1/10的分母是10, 10并不是2的冪, 因此, 在二進制中并不能用有限小數來表示1/10這個值 。 事實上, 如果將0.1轉換成二進制, 我們會得到一個無限循環小數:0.000110011001100……看到這里, 很多人估計已經想明白了, 沒錯, 計算機的精度是有限的, 并不能直接處理無限小數, 對于無限小數必須要截短到某個位置把它變成有限小數, 但截短之后這個數就不準了, 必然就產生了一點誤差, 而連續加10次會將這種誤差放大, 當誤差被放大到一定程度時, 計算的結果就會出問題了, 于是我們就看到了開頭的那一幕 。 如果用十進制來類比的話, 大家可以想象一下, 1/3+1/3+1/3=1, 但1/3只能用無限循環小數來表示, 即0.333333……, 如果我們將它截短到某一位, 假設截到0.333, 那么0.333+0.333+0.333=0.999, 你看, 同樣也會出問題 。
問題的原因總算搞清楚了, 不過感覺很坑爹啊, 計算機居然算不準小數, 但為什么平時大家很少因此遇到問題呢?那是因為大多數用戶都不用編寫程序, 但對于整天編寫程序的程序員來說, 這樣的問題其實經常遇到 。 比如說, 如果你在一段程序中需要讓計算機判斷0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1是否等于1, 計算機會告訴你不等于1, 坑爹吧?如果這段程序涉及到算錢, 有時候就會錯得很離譜, 因此有經驗的程序員在碰到小數計算的時候都會特別小心 。 當然, 作為一般用戶我們平時根本不需要關心這樣的問題, 不過計算機居然會算錯數, 怎么想都覺得挺奇妙的吧?
以上內容就是什么?計算機也會算錯數?的內容啦, 希望對你有所幫助哦!
猜你喜歡
- 秋葵是什么
- 如果移民火星,我們能吃什么?
- 秋葵是什么季節播種的
- 百香果榨汁配什么水果好喝,這6種搭配方法可美白養顏
- 金毛什么時候開始訓練
- 金鉆怎么施肥,施什么肥-
- 春節家里擺什么花最好:年花的品種有哪些
- 陶器是什么時候發明的?
- 固執!為什么有的人不撞南墻不回頭?
- 什么?他們在萬圣節雕的居然不是南瓜?
