顯示廣告
隱藏 ✕
※ 本文為 angelplume.bbs. 轉寄自 ptt.cc 更新時間: 2012-05-23 11:46:13
看板 PHP
作者 dio833 (Dio)
標題 Re: [請益] 請問(int) ((0.1 + 0.7) * 10)為什麼是7
時間 Fri May 18 01:16:05 2012


你把十進位改成二進位之後再轉回來就可以明白了
為方便計算,我假設記憶體只能存儲小數點後13位
0.1     = 0.0001100110011   (0.0之後的0011為無限循環,超出記憶體範圍者被截掉)
0.7     = 0.1011001100110   (0.1011之後的0011為無限循環...)
相加和  = 0.1100110011001
由上述再反轉回10進位,過程如下
  0.5
  0.25                         (0.75)
  0.03125                      (0.78125)
  0.015625                     (0.796875)
  0.001953125                  (0.798828125)
  0.0009765625                 (0.7998046875)
+ 0.0001220703125              (0.7999267578125)
-------------------------
  0.7999267578125

由右方可以觀察到,計算位數愈多,愈逼近某個數
而0.8轉成二進位應該是什麼呢?下面我拿0.8的二進位跟計算出來的13位比較一下
相加和  = 0.1100110011001
0.8     = 0.11001100110011001100....(無窮無盡的0011)

因此可以看出,計算位數如果愈多,愈逼近0.8的二進位
精確度取決於記憶體中存放的位數,但無論如何就是到不了0.8了
除非能保證使用的十進位小數可以轉換成二進位的有限小數
不然就算記憶體存放的位數再大,都會喪失一部分的精確度
這就是浮點數運算的弊端




※ 引述《BloodyDawn (血色曙光)》之銘言:
: 大家好~今天看書上寫了這個範例讓我滿納悶的
: PHP Code :
: echo (int) ((0.1 + 0.7) * 10);
: 正常情況下看到應該會印出8,但書上寫的答案是7
: 我也用http://writecodeonline.com/php/這個網站試了一下確實是印出7
: 書上的說法是在這邊最後計算的結果是7.999999再轉換成8
: 但遇到將型態轉成整數就會變成了7
: 那這邊有兩個問題:
: 1.我把0.7換成0.1~0.9但就只有0.7會有這個問題,請問是為什麼呢?
: 2.為什麼在這裡的計算結果會變成了7.999999呢?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.34.13.174
※ 編輯: dio833          來自: 114.34.13.174        (05/18 01:17)
kusoayan:推1F 05/18 01:56
eye2468:長知識~推~2F 05/18 10:08
kerash:push3F 05/18 10:20
BloodyDawn:原來如此,非常感謝:D4F 05/19 14:31
tyh11:Good...(Y)5F 05/19 15:56
Bambe:長知識~! 推!6F 05/19 22:39

--
※ 看板: layzer 文章推薦值: 0 目前人氣: 0 累積人氣: 655 
※ 本文也出現在看板: amyhuang
作者 dio833 的最新發文:
  • +179 Re: [問卦] 22歲開始認真唸書還來得及嗎QQ - Gossiping 板
    作者: 1.160.30.163 (台灣) 2017-10-14 05:50:02
    不確定你目前的現況是什麼? 別人的經驗可以供參考,但不能複製,你可以仿效的是態度 如果以22歲念書這一點來說,我可以分享我的經歷給你 文長,我先說明我現在的情形 目前的我是一間上市公司軟體開發的經理, …
    371F 202推 23噓
1樓 時間: 2012-05-18 12:37:19 (台灣)
囧rz
  05-18 12:37 TW
轉錯地方了吧 o_O
dinos 轉錄至看板 dinos (使用複製) 時間:2012-05-21 17:27:56
e)編輯 d)刪除 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇
看板名稱: 確定(Enter) 取消(Esc) 搜尋(Space)
查詢帳號: 確定(Enter) 取消(Esc) 搜尋(Space)
搜尋: m)m文 b)進板 c)未分類 a)作者 /)標題 q)取消?[q]

搜尋 送出(Enter) 取消(Esc)

回覆文章至: f)看板 m)作者信箱 b)兩者皆是 q)取消?[f]
要引用原文嗎? y)引用原文 n)不引用 a)全部回覆 r)複製原文 q)取消?[y]
轉錄本文章於看板: 1)使用連結 2)使用複製 q)取消 ?[1]
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc) 全部(a)

確定要刪除這篇文章?(可按大U救回) 確定(Enter) 取消(Esc)

刪除理由:

確定(Enter) 取消(Esc)
加到這個分類: 確定(Enter) 下一層(→) 回上層(←) 取消(Esc)
你覺得這篇文章: 1)真讚 2)真瞎 q)取消?[1] (再選一次即可收回)
你覺得這篇文章: 1)值得推薦 2)表示反對 3)單純註解 q)取消?[3]
guest
預覽(Enter) 取消(Esc)
上傳圖片
按ctrl+Enter可輸入下一行。
guest
確定要送出? 確定(Enter) 取消(Esc) 繼續(e)
搜尋: 送出(Enter) 取消(Esc)

▏▎▍▌▋▊▉ 請按任意鍵繼續