來源:好機友
微信id:goodjiyou
作者:機哥
終於有人注意到這個問題了!
每個人的手機當中,都藏著一個難以察覺的「漏洞」。
它也許微不足道,但運氣不好,也可能會釀成財產損失。
嗯,就是前兩天上了熱搜的——
事情是這樣的……
機哥先問問大家一個簡單的計算題。
10%+10% =?
毫無疑問,答案是 20%。
如果用小數表示,也就是 0.2。
可據網友們反映,這道簡單的計算題,卻讓大部分品牌的手機陣亡。
巧了,機哥啥都缺,唯獨不缺手機。
所以分別拿出主流品牌的手機,試了試。
結果如下:
華為
10%+10% = 0.11
小米
10%+10% = 0.11
OPPO
10%+10% = 0.11
vivo
10%+10% = 0.11
一加
10%+10% = 0.11
國產熱門品牌全線陣亡……我們來看看國外的廠商。
蘋果
10%+10% = 0.11
三星
10%+10% = 0.11
看來無論是國產,還是國外品牌,無一例外地栽了。
真的無一倖免嗎?
當機哥絕望地把目光投到國產小廠,希望出現了。
魅族!
感動,這就叫極致打磨啊朋友們。
除此之外,網友說另一家小廠商——錘子,也能通過這次考驗。
機哥拿出堅果 R1 試了一下。
錘子的計算機常規界面……並沒有 % 這個符號。
咱只能切換到科學計算器上。
果然,它也算出了我們想要的答案。
10%+10% = 0.2
但是,普通計算器和科學計算器邏輯肯定會有不同,對比稍有點不公平。
OK,所以機哥今天,決定把「年度最佳計算器」的稱號……
頒給魅族!
不過,凡事咱們不能只看表象。
手機廠商們齊刷刷「陣亡」,背後的原因到底是什麼?
其實拿小米做運算的時候,端倪就已顯現。
你們仔細看看機哥輸入的動作:
(以下是動圖,請點擊)
當機哥輸入第一個 10%,算式欄會直接把它轉化成 0.1。
可第二個 10%,卻被轉化成 0.01。
這麼一相加,結果當然是 0.11。
可問題是,計算器為什麼會把第二個 10% 識別為 0.01 呢。
其實稍微想想咱就能明白,計算器認為「 10%」在人類的語境中,代表的是「加前一個數的 10%」。
所以盡管輸入的是10%+10%,計算器實際執行的是10% (10% x 10%)。
日前小米產品總監@MIUI小凡,和榮耀總裁趙明,不約而同地在微博上解釋了這件事。
他們都有提到一個情境,可能會讓你更加理解這樣做的意義。
歐美那邊的餐廳,時常會有給小費的習慣。
假設機哥消費 200 塊錢,給 10% 小費,請問最後我該給多少錢?
如果按嚴謹的算術規則來寫,應該是:
這對於從小精通算術的中國人來說,沒毛病。
但對於那些算術稍弱的歐美人來說,就不是這樣了。
他們習慣於口語表達,200 塊,加 10%。
然後雙手跟著大腦,在鍵盤里按下 200+10% 這樣的算式。
為了「遷就」他們,手機系統無論是安卓還是 iOS,都會把不嚴謹的算式自動轉化一番。
最後他們還是能得到正確答案 220。
OK,現在你們理解手機,為什麼會出 10%+10% = 0.11 這種問題了吧。
只不過是套用了這個優化規則而已。
而轉換到科學計算器之後,部分品牌又恢復了理智。
比如小米:
話說,雖然這一話題最近才在國內引爆。
但國外有網友早在 2016 年,就對這件事產生過迷惑。
這位網友的質疑正好和我們相反
他覺得100+10%=100.1是錯的
而且,手機的計算器不是第一次出錯了。
2011 年,MIUI 論壇上出現過這樣一則帖子:
《【驚爆低級錯誤】Android 計算器出錯!!!》
這位網友在 HTC Desire 手機的計算器中輸入:
14.52 – 14.49 =
答案本該是 0.03。
但他的計算器算出來是 0.0299999……
▲圖片來自MIUI論壇
這個錯誤就不是 feature,而是一個實打實的程序缺陷。
接下來拿出小本本,機哥來給大家講解一下,為什麼會出這種錯誤。
——輕度燒腦時間開始——
我們知道,手機計算器雖然是用十進制顯示,但背後的運算靠的依然是二進制。
也就是說,當我們輸入 10+10,計算器幕後實際執行的是 1010+1010。
(十進制的 10 轉換為二進制就是 1010)
所以回到樓主提出的算式:14.52 – 14.49。
問題就出在 14.52 和 14.49 這兩個數,雖然在十進制中看起來清爽無比。
但轉換為二進制的時候,它們會變成無限循環的數。
(為什麼無限循環機哥就不說了,那是數學上的問題,我們知道結果就好)
你看,機哥用的這個二進制轉換器,就提示「超出計算精度」。
沒辦法,超出就超出吧,咱們用這個只保留 16 位的小數,進行下一步運算。
兩者相減,等於 0.0000011110101110。
再把它轉換回十進制,結果是:
▲這個轉換器精度只有16位,把我輸入的數略掉了一位
看吧,0.029998779296875,錯誤答案就是這樣出來的。
而早期安卓手機計算器的浮點精度,雖然比機哥的 16 位高,但也是有限的。
所以他們的答案是 0.0299999……
——輕度燒腦時間結束——
總而言之,這個問題不是 MIUI 的錯,也不是 HTC 的鍋,都是來源於 Android。
當時的安卓手機幾乎全部中槍。
你們不用拿出手機試,這個 bug 早就被修復了。
除了安卓,iOS 也鬧過所謂的計算器 bug。
2017 年,蘋果推出 iOS 11。
有網友反映自帶的計算器,在計算 1+2+3 這樣的幼兒園算術題,居然會給出 24 的結果。
(以下是動圖,請點擊)
出 bug 的原因非常簡單,就是因為用戶第一次點擊「+」,它會有個淡入淡出的動畫。
一旦輸入太快,動畫還沒結束時,用戶第二次點擊的「+」無法被識別。
所以算式會從「1+2+3」變成「1+23」,答案自然變成 24。
後來蘋果在 iOS 11.2 版本中,粗暴地去掉加號的淡入淡出動畫,修復此 bug。
▲圖片來自Benjamin Mayo
再後來的 iOS 11.3,蘋果加回動畫,提高響應速度,徹底解決這個問題。
▲圖片來自Benjamin Mayo
看了這麼多計算器 bug,是不是對咱們手中的「智能」手機產生懷疑了呢。
要我說嘛,還是學好數理化,背熟九九乘法表,凡事靠自己才是硬道理。