※ 本文為 dinos.bbs. 轉寄自 ptt.cc 更新時間: 2012-05-23 11:46:13
看板 PHP
作者 標題 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)
推 :推1F 05/18 01:56
推 :長知識~推~2F 05/18 10:08
推 :push3F 05/18 10:20
推 :原來如此,非常感謝:D4F 05/19 14:31
推 :Good...(Y)5F 05/19 15:56
推 :長知識~! 推!6F 05/19 22:39
--
作者 dio833 的最新發文:
- 不確定你目前的現況是什麼? 別人的經驗可以供參考,但不能複製,你可以仿效的是態度 如果以22歲念書這一點來說,我可以分享我的經歷給你 文長,我先說明我現在的情形 目前的我是一間上市公司軟體開發的經理, …371F 202推 23噓
- 你把十進位改成二進位之後再轉回來就可以明白了 為方便計算,我假設記憶體只能存儲小數點後13位 0.1 = 0.0001100110011 (0.0之後的0011為無限循環,超出記憶體範圍者被截掉) 0 …6F 6推
回列表(←)
分享