Re: [VB6 ] 其實是很新手的問題....
※ 引述《A1pha ([αλφα])》之銘言:
: : 推 LPH66:浮點數精確度 11/11 20:18
: : 推 fumizuki:所有電腦共同的精確度問題 11/11 20:51
: : → fumizuki:務必要限制小數點第幾位...Round(X, 2) 11/11 20:52
: 為什麼會有這樣的問題啊?
: 精確度問提是指說電腦也是會有「誤差」的嗎?
: 像是人用一把尺畫三公分的線,永遠不會是準的3公分這樣?
: 還有,為什麼同樣是運算,
: Val(txt_percentage)/100印出來就會是3/100=0.03
: 而不是0.03000000745058之類的?
: 感謝解答<(_ _)>
就說1/3好了
我們用十進位來算是會變成0.333333333333....的小數
那如果我們的表現空間是有限的 勢必要在某地方截掉
於是就變成0.3333333333
如果我們之後拿它去乘上6 就變成1.9999999998 不是2耶!
再抓一個: 2/3 在一樣的地方切掉 變成0.6666666667 (四捨五入)
之後拿它去乘上3 就變成2.0000000001 也不是2耶!
這就叫浮點數精確度誤差
有的時候這誤差小 印不到那麼多精確度時就會忽略
例如上面的例子我們如果只取小數3位 那都是會變成2.000的
但有時運算多次之後使得誤差變大了 就會顯示出來
例如我們拿第二個數去乘以自己5次再乘以3六次 理論上要變成2^6=64 但實際上:
0.6666666667
0.4444444445 一次
0.2962962963 二次
0.1975308642 三次
0.1316872428 四次
0.0877914952 五次
0.2633825856 一次
0.7901477568 二次
2.3704432704 三次
7.1113298112 四次
21.3339894336 五次
64.0019683008 六次
取(顯示)到小數第3位 變成64.002了!
運算一多誤差擴大就會這樣
---
以上是在十進位下的類比
電腦內部是用二進位存的
所以就會有像0.2這樣的十進位有限小數在二進位也必須近似表示
(0.2的二進位:0.0011001100110011........)
不過道理是類似的
--
実琴:「河野!你真的就這樣被物質慾望給吸引過去了嗎?!」
亨:「只要穿著女裝擺出親切的樣子,所有必要花費就能全免,似乎一點都不壞啊。」
実琴:「難道你沒有男人的尊嚴了嗎?!」
亨:(斷然道)「沒有。在節衣縮食且生活吃緊的學生面前,沒有那種東西。」
--プリンセス・プリンセス 第二話
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 192.192.197.115
推
11/12 04:13, , 1F
11/12 04:13, 1F
討論串 (同標題文章)