iT邦幫忙

0

reporting 的Round()

自從寫了reporting 報表開始,噩夢不斷。
明明這個函數是4捨5入,為什麼它有時候會四捨五入有時候不會。
永遠都解決不了,一直被叫來竄改報表。

為終於找到解答的問題,留篇文章,以供後來的人不再撞牆。

終於在https://dotblogs.com.tw/jeff-yeh/2009/06/15/8834 找到了解答。
跟我們所認知的四捨五入不同,其實它沒有錯哦,這些只是誤會,從MSDN裡可以看到一點,它所遵循的是IEEE Standard 754第4節,這種捨入有時稱為捨入至最接近值。如果要捨入值為偶數,則捨去,如果為奇數,則進位,有看沒有懂哦,用下列幾個數字來解說一下.

0.5 =0
*因為要捨入值為偶數0,所以捨去0.5為0
1.5 = 2
*因為要捨入值為奇數1,所以進位0.5為2
2.5 = 2
*因為要捨入值為偶數2,所以捨去0.5為2
3.5 = 4
*因為要捨入值為奇數3,所以進位0.5為4

這個就是所謂的四捨六入五成雙(Banker’s Rounding)~

那要怎麼做才能達到我們”原本預期”的四捨五入?
在.Net 2.0以上的Math.round多了一個MidpointRounding的參數可以傳入.
MidpointRounding.ToEven [Banker’s Rounding]
MidpointRounding.AwayFromZero [這就是大家小學所熟悉的四捨五入]
用法 :
Math.round(0.5,0,MidpointRounding.AwayFromZero) = 1


1 則留言

1
wilson1966
iT邦研究生 5 級 ‧ 2019-01-11 08:15:31

讚,寫的詳細。當初在寫合計程式也碰到同樣問題,也是Google 好久才找到答案。心中有一個很大疑問,四捨五入觀念是國產還是外來傳入的,如是外來傳入的,怎跟美國不一樣呢?

kairosa iT邦新手 3 級‧ 2019-01-11 15:48:42 檢舉

無奈,這應該是趨近最近值,但是問題是這翻譯是寫4捨5入。
我在寫Code時,曾經一度以為這是五捨六入,困擾很久。
直到今天才找到解決方式,那個翻譯真的是太坑人了。

我要留言

立即登入留言