Pages

2006年10月11日 星期三

四捨五入的兩三事:Round 與 Format

平常在 Coding 的時候我四捨五入一直以來都是用 Round() 這個函數,自己也沒太多注意是否正確,因為自打從有印象以來,Round() 這個歸類在 Math Class 底下的函數就是我認知的四捨五入的用法,直到今天,測試了一下才令我嚇出一身冷汗...。

如果妳也使用 VB、ASP、或 ASP.Net 妳可以測試一下。舉個例子,1.115 四捨五入到小數第二位我們都知道應該是 1.12,使用 Round(1.115,2) 也可以得到 1.12 這個數字,我們再來看看 1.125 四捨五入到小數第二位,結果很神奇的是,Round(1.125,2) 並不會得到我們所預期的 1.13,Round(1.125,2) 回傳竟然還是 1.12,這到底是怎麼回事呢?是 Bug 嗎?

在微軟的 Knowledge Base 裡的 PRB: Round Function different in VBA 6 and Excel Spreadsheet 也有提到這個問題,在 Excel 裡所使用 Round 這個函數是正常的 (=Round(1.125, 2)),可是在 VB Like 的 program 裡卻不會,天... 真是令我百思不得其解,老大,我真的是想不透你啊...。後來再繼續找,接著在另一篇 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)。據說這還符合國際標準咧,稿得還真複雜。除了 Round() 這個函數外 CByte()、CInt()、CLng()、CCur() 也都是使用 Banker's Rounding。

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

又是一個沉悶的東西,不過至少說不定對某些人搞不好會有點幫助。

6 回應:

Chia 提到...

數學
我頭痛去了..

匿名 提到...

感謝你的分享....................................................

匿名 提到...

謝謝分享~

匿名 提到...

The other day, while I was at woгκ, mу сousin
stοle my iPad and tested to see if it can suгѵive a 25
foοt dгop, just so she cаn be a уoutubе sensatiоn.
My applе iрad is now ԁestroyed аnd she has 83 viewѕ.
I know this is completely off topic but I had to share it ωith
ѕomeоne!

My homepage ... chatroulette

Unknown 提到...

More Info Dolabuy Prada from this source find learn this here now Dolabuy Fendi

sheshaez 提到...

Your Domain Name replica bags seoul go to my site replica bags in bangkok content best replica bags online 2018