2015-06-28 39 views
0

十進制數類型相對於雙層類型的考慮下面的代碼:精度在.net

Dim doubleResult = (21/88) * 11 
    Dim decimalResult = Decimal.Divide(21, 88) * 11 

doubleResult是2.625,因爲它應該。

decimalResult是2.6249999999999996,所以這四捨五入至小數點後兩位時會給出不正確的結果。

當我改變分配:

Dim decimalResult = Decimal.Divide(21 * 11, 88) 

結果是2.625!

我們在我們的應用程序通過希望它可以給我們增加了精度(它是一個評分程序中,分數可以有小數點後面最多一位)小數類型。但是,似乎十進制類型在其他計算上的結果稍微不正確,這是因爲它基於十個而非兩個基礎。

那麼,如何做,我們必須處理這個特質,以避免舍入誤差如上?中點四捨五入的

+0

我不知道VB.NET轉換規則,但我的猜測是,Decimal.Divide'的'結果被轉換成'Double'乘以前11.在CLR中實現'Decimal'的方式,不可能得到使用'Decimal'的結果。嘗試使用'11D'而不是'11'。 – siride

+0

@siride使用'11D'並沒有什麼區別。 'decimalResult' *是*小數。 – Dabblernl

+0

'Decimal'實際上只是一個浮點數,它使用基數10而不是基數2.因此,總會有可能得到不圓的數字,就像使用'Double'一樣,但條件會有所不同。這實際上沒有辦法解決這個問題,因爲數字必須適應有限的記憶,儘管它們可能是無限的。儘管如此,對於貨幣計算,「十進制」更可能不存在這些類型的舍入問題,因爲貨幣計算主要涉及基數10的附加和減法。 – siride

回答

0

Dim adec As Decimal = 231D 
    adec /= 88D 

    adec = Math.Round(adec, 2, MidpointRounding.AwayFromZero) 
+0

你是不是故意在第二個例子中說'As Double'? – siride

+0

@siride - 謝謝。固定。 – dbasnett