看板 PHP 關於我們 聯絡資訊
你把十進位改成二進位之後再轉回來就可以明白了 為方便計算,我假設記憶體只能存儲小數點後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:推 05/18 01:56
eye2468:長知識~推~ 05/18 10:08
kerash:push 05/18 10:20
BloodyDawn:原來如此,非常感謝:D 05/19 14:31
tyh11:Good...(Y) 05/19 15:56
Bambe:長知識~! 推! 05/19 22:39