MozTW 討論區
https://forum.moztw.org/

JAVASCRIPT
https://forum.moztw.org/viewtopic.php?f=8&t=22139
1 頁 (共 1 頁)

發表人:  Amauds [ 2008-04-11, 23:37 ]
文章主題 :  JAVASCRIPT

不太清楚JAVASCRIPT的運算邏輯,
3000*21.3-91-192=63617
3000*21.4-91-192=63916.99999999999

3000*10.1-43-91=30166
3000*10.2-43-91=30465.999999999996

這是硬體或系統的錯誤呢?
Windows XP sp2 + Firefox 2.0.0.13
Windows XP sp2 + Internet Explorer 7.0

發表人:  legnaleurc [ 2008-04-12, 00:14 ]
文章主題 : 

浮點數的精準度問題吧
很多語言都會有的

發表人:  訪客 [ 2008-04-12, 00:17 ]
文章主題 : 

Amauds 寫:
不太清楚JAVASCRIPT的運算邏輯,
3000*21.3-91-192=63617
3000*21.4-91-192=63916.99999999999

3000*10.1-43-91=30166
3000*10.2-43-91=30465.999999999996

這是硬體或系統的錯誤呢?
Windows XP sp2 + Firefox 2.0.0.13
Windows XP sp2 + Internet Explorer 7.0


印象中和 binary float point 有關(原諒我,我不是很確定),有些十進位的有理數無法用二進位的有限小數來表示。

http://en.wikipedia.org/wiki/Binary_number

代碼:
Yet another example:
document.write(1.3 * 1.3);

發表人:  kourge [ 2008-04-12, 13:13 ]
文章主題 : 

原因是因為 JavaScript 的數字是「雙精確度 64 位元格式 IEEE 754 值」

發表人:  翔風 [ 2008-04-13, 23:35 ]
文章主題 : 

(呆掉的某人)
雙精確度 64 位元
居然比不上
兒童精確度人腦位元 :lol: :lol:

發表人:  Dark Shenada [ 2008-04-14, 03:40 ]
文章主題 : 

Amauds 寫:
不太清楚JAVASCRIPT的運算邏輯,
3000*21.3-91-192=63617
3000*21.4-91-192=63916.99999999999

3000*10.1-43-91=30166
3000*10.2-43-91=30465.999999999996

這是硬體或系統的錯誤呢?
Windows XP sp2 + Firefox 2.0.0.13
Windows XP sp2 + Internet Explorer 7.0


雖然知道你在寫什麼, 但是
如果有人在我手上的project commit這種不加括號
在, 連續使用運算子的算式裡, 一定直接reverse處理,
外加梟首示眾, 雖然OP順序上沒有爭議, 但是這種寫
法本身就不具可讀性, 對一個多人的project來說就
是浪費所有人的時間, 又或是萬不一, 有人需要修改
又沒太多時間時, 就有可能發生誤解的狀況.....
(多加一些括號累得又不是你, 是compiler/interpreter,
別那麼吝嗇使用括號阿 ORZ)

發表人:  legnaleurc [ 2008-04-14, 11:44 ]
文章主題 : 

翔風 寫:
(呆掉的某人)
雙精確度 64 位元
居然比不上
兒童精確度人腦位元 :lol: :lol:


這算是非戰之罪吧
十位數的小數點對計算機來說
有時很像人類在算三分圓的情形
只是人類比較習慣用十進位而已

Dark Shenada 寫:
雖然知道你在寫什麼, 但是
如果有人在我手上的project commit這種不加括號
在, 連續使用運算子的算式裡, 一定直接reverse處理,
外加梟首示眾, 雖然OP順序上沒有爭議, 但是這種寫
法本身就不具可讀性, 對一個多人的project來說就
是浪費所有人的時間, 又或是萬不一, 有人需要修改
又沒太多時間時, 就有可能發生誤解的狀況.....
(多加一些括號累得又不是你, 是compiler/interpreter,
別那麼吝嗇使用括號阿 ORZ)


沒這麼嚴重吧....
不過是舉例而已
而且有時太多括號反而有礙觀瞻
像是C的pointer of function寫到極致的時候

發表人:  Dark Shenada [ 2008-04-15, 06:46 ]
文章主題 : 

legnaleurc 寫:
沒這麼嚴重吧....
不過是舉例而已
而且有時太多括號反而有礙觀瞻
像是C的pointer of function寫到極致的時候


嗯, 因為昨天我手上的project中的member,
剛發生了一件由不括號引發的血案, 由於是發生在
用來傳遞signal 的share memory中, 害的所有關係人
都沒得睡, 所以 ..... 有點過度敏感了 (汗)

p.s: 直到剛才還在review (41個小時了) ..... 還我睡眠來 (口孔)

pointer of function寫到極致時還是可以用空白, 換行, 縮排, macro和增加變數來處理,
多人開發時可讀性是最重要的, 如果不必要寫在一行的就不因該寫在一行, 能分成多個敘述
的就以語意和方便閱讀為原則分拆

把一堆code寫在一行執行上"不會"比較快, 寫的人也不會比較厲害, 只是增加同伴和以後維護
的人的困擾

發表人:  legnaleurc [ 2008-04-19, 16:14 ]
文章主題 : 

個人覺得啦
很多時候"一段註解"比"十對括號"還來得有幫助

發表人:  Amauds [ 2008-04-19, 20:16 ]
文章主題 : 

非常感謝各位的回答,最近筆電內建網卡一直有問題,
沒能很快回應大家,深感抱歉。

太久沒摸程式,我想知道的是,除去所謂括號的問題之外,
同樣的問題在其它程式語言發生的機率大不大?
之前的例子並非刻意找出來的,只是在一個很小的股票報酬率計算程式中引發的,而資料量還不到 150 筆,如果資料量更大,那出錯的機率一定會更大,這個程式等同無效,因為根本算不出正確的金額,那報酬率也就不用算了。

發表人:  legnaleurc [ 2008-04-19, 22:25 ]
文章主題 : 

很常發生啊
C就常會有5平方等於24的結果(用math.h的pow)
修正的方法大部分都是用很dirty的方式進位或捨棄

但是如果保持在浮點數不去轉型成整數的話
我通常都不太理它的
0.000000000000001的誤差實在是....

1 頁 (共 1 頁) 所有顯示的時間為 UTC + 8 小時
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/