十個0.1加起來 等於0.9999999999999999?

2021-01-08 快科技

人們通常不會懷疑計算機在數學計算上的結果,畢竟,如果連數都算不對,那還叫什麼「計算機」啦?其實,有個簡單的題目就能讓計算機算錯,不信我們試試看。

如果你用Chrome瀏覽器的話,按下F12(在Mac上要按Command+Option+I)可以打開一個「開發者工具」窗口,然後點上面的「Console」標籤,你會看到一個控制臺窗口,在裡面輸入「0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1」(一共10個0.1),按下回車,看看結果是什麼?

矮馬,嚇死本寶寶了,明眼人一看就知道算錯了是吧?10個0.1加起來應該等於1啊!

不過如果你試一下「0.1*10」,咦,這次結果又對了!這什麼鬼?

好吧,放心,你的電腦沒壞,我們來看看這到底是怎麼回事。

稍早接觸計算機的那一代人幾乎都知道計算機的內部運算都是以二進位來進行的,然而現在的用戶恐怕早就不關心這件事了。自從馮·諾依曼提出現代計算機架構以來,幾十年了計算機的原理都沒有什麼根本性的變化。

我們人類在日常生活中通常使用十進位,有一種說法認為這是因為人有10個手指,但在電路設計上要表示10個狀態可就相當困難了,不過很多元件都可以很容易地表示兩個狀態,比如開和關,電平高和低,因此採用二進位對於計算機來說是一個最方便的設計。

正是因為人類和計算機使用的進位不同,因此在進行計算時,就必然會涉及到進位的轉換,也就是說,我們在屏幕上輸入的是十進位的數字,然後計算機要將它轉換成二進位進行計算,然後再把計算的結果轉換成十進位顯示出來。

之所以上面那個題目計算機會算錯,本質上說就是二進位惹的禍。

要搞清楚這個問題,我們先來理解一下進位的概念。在十進位中,一位數字我們可以使用0到9,比9多的時候就會變成10,這就是一個兩位數了,也就是進位了,二進位也是一樣,只不過一位數字只能使用0和1,再多就要進位了。

那麼進位的本質又是什麼呢?我們隨便拿一個十進位的數字來看一看:

看懂了沒?一個十進位數實際上就是其中每一位數依次乘以10的0、1、2…次冪(權重),然後再把結果加起來,那麼以此類推,二進位裡面就是把上面的10換成2唄?我們來看一個:

於是二進位數1001也就是十進位數的9。

到這裡似乎還沒什麼問題,因為我們只討論了整數呢,每一個十進位整數都可以轉換成一個二進位整數,反過來,每一個二進位整數也都可以轉換成一個十進位整數。

不過,如果把小數也加進來呢?先看一個十進位的小數:

看懂了沒?其實就是把10上面的指數變成了負數而已,不難吧。那麼以此類推,二進位的小數也就是把10換成2唄,我們來看一個:

上面我們理解了進位的一些本質特性,算不過來也沒關係,我們暫且先不管它,不過,這跟我們遇到的問題到底有什麼關係?別急,我們再看一下當引入小數之後,進位之間的轉換到底出了什麼bug。

我們知道實數的數軸是連續的,每兩個數字之間的部分是可以被無限分割的。舉個例子,0和1之間的這部分,如果用十進位一位小數來分割的話,可以分成10份,也就是0.1、0.2、0.3……0.9、1,如果用二進位一位小數來分割的話,則只能分成兩份,也就是0.1(十進位的0.5)、1。

你發現了什麼問題?無論小數點後面增加多少位數字,二進位永遠只能以2來分割數軸,而十進位則是以10來分割數軸。

讓我們回想一下小學的數學知識,在十進位中,如果要用有限小數來表示一個分數的值,那麼這個分數的分母(化簡之後)一定不能包含除了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,坑爹吧?如果這段程序涉及到算錢,有時候就會錯得很離譜,因此有經驗的程式設計師在碰到小數計算的時候都會特別小心。

當然,作為一般用戶我們平時根本不需要關心這樣的問題,不過計算機居然會算錯數,怎麼想都覺得挺奇妙的吧?

相關焦點

  • 【數學】為什麼奇數加奇數等於偶數,奇數加偶數等於奇數?
    有一次Vita哥哥要考我一道題,就是那種兩個很大的數加起來,判斷結果是奇數還是偶數的題。我問他,那你是知道這裡面的規律咯?他很得瑟地說,對啊,奇數加奇數等於偶數,奇數加偶數等於奇數,偶數加偶數也等於偶數!於是我問他:為什麼呢?
  • 1加sin30等於幾_1加sin30°等於什麼
    1加sin30等於幾_1加sin30°等於什麼時間:2020-07-05 07:06   來源:今日頭條   責任編輯:毛青青 川北在線核心提示:原標題:1加sin30等於幾_1加sin30等於什麼 1加sin30等於幾?1加sin30=1還是1.5?
  • 無數個正數加起來,結果一定是無窮大嗎?
    其實數學裡面有一個非常神奇的加法運算,就是把無數個正數加起來,最後算結果是多少,這種運算有啥神奇之處呢?我們來談談這個問題。首先問大家一個問題,5個正數加起來,結果等於多少?也許你會覺得,你都沒告訴我這5個正數具體是啥,我怎麼會知道結果?哈哈,其實我並非讓你回答出結果,我只需讓你回答出結果所具有的特性結果。5個正數加起來,結果具有啥特性?
  • 6加10等於1答案是什麼 6()十10()=1()多有答案匯總
    6加10等於1答案是什麼?相信小夥伴們一定很好奇,下面小編為大家帶來了6()十10()=1()求答案詳解,感興趣的小夥伴趕緊跟著小編一起來看看吧。  6()十10()=1()求答案:  最近,朋友圈流行著這樣一道題:那麼6()+10()=1()?沒想到這個題目難倒了不少人。你會給出怎樣的答案,來看看網友的答案吧。
  • 2的0次方為什麼等於1?
    十進位就是逢10進1,每計滿10個數就向高位進1,使用0到9十個數字,從右往左分別表示個位、十位、百位、千位......各個位置上的數字代表有多少個該數位的值,整體表示的數就是把各個數位的值乘這個數位的數量,最後累加起來,比如2503代表的是2個1000、5個100、0個10、3個1累加的結果,即2503=2*1000+5*100+0*10+3*1,1000、100
  • 甲醛0.1毫克每立方是否超標
    目前為止我國一共有兩個標準,即:衛生部標準0.08mg/m3以下含和國家標準0.10mg/m3以下含,為了方便記憶目前為止基本上都以0.1作為參考標準,甲醛有刺激性氣味,對人體危害非常嚴重。除甲醛主要是開窗通風,但是通風只有一個目的就是讓屋內的空氣流通起來這樣才能人在室內吸入甲醛。
  • 面試官:一加一不等於二,等於什麼?男子高智商回答,被錄取!
    面試官:一加一不等於二,等於什麼?男子高智商回答,被錄取!無論是職場老手還是職場新人,想要入職一家公司,就必須通過HR的面試審核,而職場的「老油條」們,也必定是經歷無數「明爭暗鬥」過來的。劉德華是一名管理專業畢業的大學生,他和其他同學一樣,為了找份待遇更好的工作,苦苦尋找了十來天,終於得到了某大型公司的高級銷售員崗位的面試邀請,德華也知道這份工作來之不易,因此在面試前也做了很多準備。
  • 【數學】0的0次方到底等於幾?
    因為分子有4個2,分母只有3個2,所以很顯然,結果等於2。這時就可以讓Vita找找規律了,2的4次方除以2的3次方,指數是怎樣變化的呢?於是我們把0的0次方等於幾變成了一個求組合數C(0,0)的問題,也就是說,一個袋子裡面有0個球,現在要拿出其中的0個,有幾種拿法?
  • 十個冷知識!螞蟻總重量等於人類總重量?
    十個冷知識,你知道多少個呢?趕緊get起來吧!1.奇異果很多人以為是紐西蘭特產,其實它的祖籍是中國,原名獼猴桃,一個世紀以前才引進入紐西蘭。奇異果實際上就是紐西蘭選育出來的優質獼猴桃。微信9.地球上的人如果平分螞蟻,每個人將得到160萬隻,它們的總重量大概等於人類的總重量。
  • Python計算0.1+0.2≠0.3? 6張圖搞清楚原理!
    如果小數位是0.25就會比較簡單,例如:0.25 * 2 = 0.5 // 小於1,則繼續乘0.5 * 2 = 1 // 等於1,則結束結束時,將相乘之後等結果的整數部分拼接起來,所以 0.25 的二進位表示
  • 0.9的無限循環和1比,誰更大?答案出乎意料
    0.9的無限循環和1比,誰更大?初看到這個問題的時候,你是不是會下意識地說1更大一點呢?但是實際上,這個看起來蠻合乎情理的答案,卻受到了數學家們的質疑。因為在很多數學家的邏輯裡,0.9的無限循環並不小於1,它等於1。
  • 0.999……真的等於1嗎?
    又因為m大於0.99而小於1,則m的小數形式應該是以0.99開頭的。通過這樣一步步推演,我們證明m的小數形式必然是0.999…。因此,m等於兩個數中較小的那個。這是不合邏輯的,因為兩個不相等的數的平均值不可能等於其中任何一個。因此,最初的假設0.999…<1是錯的。
  • 知否| 1為什麼等於0.99999...|未知量|數學|原理|等式_網易科技
    數學家威廉士·拜爾在《How Mathematicians Think》中評價這個證明:「0.999... 既可以代表把無限個分數加起來的過程,也可以代表這個過程的結果。許多學生僅僅把0.999... 看作一個過程,但是1是一個數,過程怎麼會等於一個數呢?這就是數學中的二義性?他們並沒有發現其實這個無限的過程可以理解成一個數。
  • 1加2加3等於24是什麼梗? 蘋果簡單粗暴且不可思議的BUG了解一下
    原標題:1加2加3等於24是什麼梗? 蘋果簡單粗暴且不可思議的BUG了解一下     1加2加3等於24是不是覺得很不可思議,明明不是等於6嗎?那麼1加2加3等於24是什麼梗?1加2加3等於24是什麼意思?下面就一起來看看吧!
  • 抖音28256相加得多少 抖音28256加起來等於1314520什麼梗
    抖音28256這首歌前段時間特別火,現在用計算器28256相加等於1314520這個梗又火了,下面,我們來看看詳細介紹吧!抖音28256相加完得多少?最近又出了一個新梗,有個網友曬出了28256、28257相加的結果是1314520,這是真的嗎?竟然這麼神奇嗎?
  • 為什麼0.1+0.2不等於0.3?原來程式語言是這麼算的……
    0.30000000000000004 對不對?為什麼結果不是 0.3?本文作者給出了詳細的解釋。從小我們就知道 0.1 + 0.2=0.3。但是,在光怪陸離的計算世界中,運算方式卻大相逕庭。我最近開始用 JavaScript 進行編碼,在閱讀數據類型時,我注意到 0.1 + 0.2 不等於 0.3 的奇怪行為。
  • 搞錯了,0.9的循環是等於1,但不是恆等於1
    0.999……無限循環等於1嗎?這是非常老的一道題,相信絕大部分人都聽說過。先說筆者的答案:等於1,但不恆等於1。等於1很好證明。令X=0.999……,10倍的X即10X=9.999……。10X-X=9X,也等於9.999……-0.999……=9。由此可得9X=9,X=1,所以0.999……=1。
  • 為什麼0的階乘等於1
    為什麼0的階乘等於1?看了很多大神的論證過程,邏輯嚴謹,忠於學術,又勤奮。但感覺都沒啥說服力啊,反正我也看不懂。。。。。。
  • 1×0=0是0乘以任何數字都等於 0還是1乘任何數字都等於那個數?
    在一個環裡,1是乘法單位元,0是加法單位元。假設這個環不是零環,那麼1和0就是兩個不同的元素。因為環在乘法下是么半群,所以對於任意的元素a,a×1=a=1×a是環的公理。由此可得第一種證明思路:取a=0,則0×1 = 1×0 = 0。
  • 一年級數學上冊 第6單元 第3課時 10加幾、十幾加幾及相應的減法
    難點:正確計算10加幾、十幾加幾和相應的減法。教學過程課件出示:1個十和3個一合起來是(  )。15裡面有(  )個十和(  )個一。1 個十和(  )個一合起來是19。師:十幾可以分成1個十和幾個一;反過來,1個十和幾個一可以組成十幾。今天我們就一起來學習10加幾的加法和相應的減法。(板書課題。)1.教學例4。