台灣最大程式設計社群網站
線上人數
920
 
會員總數:245221
討論主題:189091
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 解決VBScript round函數會碰上的四捨五入問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
解決VBScript round函數會碰上的四捨五入問題
價值 : 0 QP  點閱數:925 回應數:0

樓主

Lak
初級專家
1744 27
2116 739
發送站內信

捐贈 VP 給 Lak
今天在上班的時後,聽到老闆提到,有人用 VBScript 寫四捨五入,結果寫出了一堆 bug,
一追究之下,才發現..原來..在 VBScript 中的 Round,不是我們想像中的 Round..

根據他們的說法,Round 在 n.5 的情況下,會發生一些靈異的狀況,而也就是因此,
他們的程式出現了一些 Bug,而也由於不了解這個 bug 是產生原因,因此花了很大的功夫在 debug 上面,
最後才發現是 Round 出了問題。

阿我那個無聊的耳朵,就那麼不小心的聽到他們的談話,心中不免有了個 OS ..
如果真的是 bug ..那也太誇張了吧?VBScript 的 Round 這麼常會被使用到的函式,可能放著 bug 不去修正嗎?
於是便上了網,查了一下資料,原來,Round 還真的不是那麼簡單的


最接近參數 d 的整數。如果 d 正好為兩個整數的中間數 (一個為偶數,另一個為奇數),則會傳回偶數。這是所謂的銀行家四捨五入法(Round-To-Even),也叫做Bankers' Rounding
節錄自:http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/06/15/kb-net-math-quiz.aspx


這是一段在網路上看到的文字,應該是自 MSDN 中翻譯出來的,感謝這位老大哥把這東東提出來談。
而由上面的文字我們可以了解到,在使用 VBScript 的 round 時,應該還要自行加一堆有的沒有判斷式,
來確保你的 Round 是正常的動作,但是在 JavaScript 的 Math.round() 下卻不會出現這個問題,
基於程式人員的「偷懶最高指導原則」,所以便利用 JavaScript 寫下了一個讓 VBScript 呼叫的 round 函式,
下面是這個想法的實做。


<Script language="JavaScript">
function Jround(num)
{
if (arguments[1]) return num.toFixed(arguments[1]) ;
else return Math.round(num)
}
</Script>

// 以下為測試區,可以看的出來 VBScript 的 Round 的確有一些麻煩
// 而利用我們所寫的 Jround 便可以解決掉這個麻煩的問題。
<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>


上面的東西是我最近碰到的一些問題及一些新的發現所寫出來的小工具,
但我還沒有很深入的去實測,所以如果有發現什麼 bug ,也請在板上提出來,
我會馬上做修正。

希望這個小東西可以幫助和我有相同問題的人解決麻煩。
搜尋相關Tags的文章: [ round ] , [ JavaScript ] , [ VBScript ] , [ 四捨五入 ] ,
本篇文章發表於2008-05-19 13:05
== 簽名檔 ==
By Lak
Web Site: Lak4CYUT.blogspot.com
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.