2008年10月14日 星期二

關於四捨五入二三言

平常在 Coding 的時候,很多人四捨五入應該都是用 Round() 這個函數,因為自打從有印象以來,Round() 這個歸類在 Math Class 底下的函數就是我認知的四捨五入的用法,其時多年前在做人薪系統時就發現內藏玄機,今天心血來潮,上網查了一下資料...

舉個例子,1.115 四捨五入到小數第二位我們都知道應該是 1.12,使用 Round(1.115,2) 也可以得到 1.12 這個數字,我們再來看看 1.125 四捨五入到小數第二位,結果很神奇的,Round(1.125,2) 並不會得到我們所預期的 1.13,Round(1.125,2) 回傳竟然還是 1.12,這到底是怎麼回事呢?!@#$....

上網查了一下,在一篇How To Implement Custom Rounding Procedures提到了說 Rounding 有分兩種,Arithmetic Rounding 跟 Banker's Rounding...

Arithmetic Rounding 就是我們平常所說的四捨五入,就不多說了。Banker's Rounding,它也是四捨五入沒錯,只不過他是奇入偶不入,所以只有當遇到奇數位的時候會四捨五入 (所以 1.115 會進位成 1.12) ,否則就是五捨六入 (所以 1.125 是捨去變成 1.12,如果是 1.126 則變成 1.13)。VB除了 Round() 這個函數外 CByte()、CInt()、CLng()、CCur() 也都是使用Banker's Rounding,Delphi的Round()函數也是Banker's Rounding,大家最好查一下HELP,看一下官方提供的說明。

那到底要如何四捨五入呢?目前所想到是應該用 Format() 這個函式 (return string type)。1.115 四捨五入至小數點第二位則寫成 Format(1.115,".00") 就可以回傳正確值了,值得注意的地方是他會自動幫你補零,也就是如果是 Format(1.101,".00") 它會回傳 "1.10" 而不是 1.1,如果你要它回傳 1.1 則應該寫成 Format(1.101,".##"),這樣就不會幫妳補零了。

沒有留言: