今天在上班的時後,聽到老闆提到,有人用 VBScript 寫四捨五入,
結果寫出了 bug .. 一追究之下,才發現..原來..Round不是我們想像中的 Round..
據他們的說法,Round 在 n.5 的情況下,會發生很多靈異的狀況。
而也就是因此,他們的程式出現了一些 Bug ..
啊我那個無聊的耳朵,在聽到他們的談話之後,就忍不住上了網,查了一下資料。
原來,Round 還真的不是那麼簡單的..
最接近參數 d 的整數。如果 d 正好為兩個整數的中間數 (一個為偶數,另一個為奇數),則會傳回偶數。這是所謂的銀行家四捨五入法(Round-To-Even),也叫做Bankers' Rounding這是一段在網路上看到的文字,應該是自 MSDN 中翻譯出來的,感謝這位老大哥把這東東提出來談,
也因此,在使用 VBScript 的 round 時,應該還要自行加一堆有的沒有判斷式,
但是在 JavaScript 的部份,卻不會出現這個問題,基於寫程式人員的「偷懶指導原則」,
所以便利用 JavaScript 寫下了一個讓 VBScript 呼叫的 round 函式,以下是想法的實做。
<Script language="JavaScript"> function Jround(num) { if (arguments[1]) return num.toFixed(arguments[1]) ; else return Math.round(num) } </Script> <Script language="VBScript"> msgbox round(4.5) msgbox Jround(4.5) msgbox round(3.5) msgbox Jround(3.5) msgbox round(2.5) msgbox Jround(2.5) msgbox round(3.0005,3) msgbox Jround(3.0005,3) </Script>
希望這個小東西可以幫助和我有相同問題的人解決麻煩。
沒有留言:
張貼留言