新聞中心
前段時間做了一個關(guān)于Multiple Currency的項目。其中遇到了一些關(guān)于精度的問題。
現(xiàn)在我就把其中學(xué)到的東西share一下。

舉一個例子:
在項目中。所有的item的price 是基于美元的。但是這個item的vendor又是屬于Canada,要給加元,那么在計算amount的時候需要將price * count ,再將結(jié)果根據(jù)匯率轉(zhuǎn)換成加元, 再取兩位小數(shù)。
例如:$1.45(Price) * 11(Count) = 15.95(Amount) * 1.2222222222(Exchange Rate) = 16.56567395 (Amount)
最后 16.56567395 就是我們需要付的money?,F(xiàn)在問題來了,再將16.56567395加元換回美元。。。呵呵。偏差就出現(xiàn)了。
這里就有人提出了關(guān)于取精度的問題,
我所知道的有兩種:四舍五入,四舍六入五成雙。不知道大家有沒有試過.net中自帶的ToString與數(shù)字格式字符串。它所適用的就是四舍五入的方式來取整。但是它有一個弊病。如果多次進行轉(zhuǎn)換。數(shù)值會偏高。不平衡。
.net中還有一中方式就是Math.Round來取精度。 支持以上所說的兩種機制。
MidpointRounding.ToEven 四舍六入五成雙
MidpointRounding.AwayFromZero四舍五入
當(dāng)然最終解決方案是MidpointRounding.ToEven.
什么叫四舍六入五成雙??為什么用呢。四舍六入是一樣的,五成雙的意思就是,如果前面一個為偶數(shù)就忽略。為奇數(shù)就進一位,歐洲銀行全采用這個算法,這樣可以減少偏差
總結(jié):
ToString默認(rèn)采用四舍五入取精度,
Math.Round 可以選擇取精度方式.
也許你們會提出為什么不從新計算一次Amount,就不用講加元換成美元呢。。。呵呵。 業(yè)務(wù)復(fù)雜。改動風(fēng)險大.
這里只是幫助大家回憶一下這次差不多遺忘的東西。只是share.放到首頁也是冒著被拍磚的風(fēng)險
文章標(biāo)題:編程基礎(chǔ)回顧:有關(guān)取精度,ToString和Math.Round
網(wǎng)站鏈接:http://m.fisionsoft.com.cn/article/coidoce.html


咨詢
建站咨詢
