十進制數類型相對於雙層類型的考慮下面的代碼:精度在.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!
我們在我們的應用程序通過希望它可以給我們增加了精度(它是一個評分程序中,分數可以有小數點後面最多一位)小數類型。但是,似乎十進制類型在其他計算上的結果稍微不正確,這是因爲它基於十個而非兩個基礎。
那麼,如何做,我們必須處理這個特質,以避免舍入誤差如上?中點四捨五入的
我不知道VB.NET轉換規則,但我的猜測是,Decimal.Divide'的'結果被轉換成'Double'乘以前11.在CLR中實現'Decimal'的方式,不可能得到使用'Decimal'的結果。嘗試使用'11D'而不是'11'。 – siride
@siride使用'11D'並沒有什麼區別。 'decimalResult' *是*小數。 – Dabblernl
'Decimal'實際上只是一個浮點數,它使用基數10而不是基數2.因此,總會有可能得到不圓的數字,就像使用'Double'一樣,但條件會有所不同。這實際上沒有辦法解決這個問題,因爲數字必須適應有限的記憶,儘管它們可能是無限的。儘管如此,對於貨幣計算,「十進制」更可能不存在這些類型的舍入問題,因爲貨幣計算主要涉及基數10的附加和減法。 – siride