我明白這個問題背後的原理,但它讓我很頭痛,認爲這在整個我的應用程序中都在發生,我需要找到解決方案。C#數學給出了錯誤的結果!
double Value = 141.1;
double Discount = 25.0;
double disc = Value * Discount/100; // disc = 35.275
Value -= disc; // Value = 105.824999999999999
Value = Functions.Round(Value, 2); // Value = 105.82
我使用雙打代表相當小的數字。不知怎的,在計算141.1 - 35.275中,結果的二進制表示給出了一個只有0.0000000000001的數字。不幸的是,由於我將這個數字四捨五入,這給出了錯誤的答案。
我已經閱讀過有關使用小數而不是雙精度的方法,但是我無法用小數來替換Double的每個實例。有沒有更簡單的方法來解決這個問題?
舍入爲3位小數,然後舍入爲2位小數?啊...並且要知道Math.Round使用Banker的四捨五入來循環,所以0。5時間縮短了一半,一半時間縮短了。有一個選項可以使用「標準」舍入。這是MidpointRounding.AwayFromZero。 – xanatos 2011-03-03 10:31:20
由於我們在這裏討論的是貨幣數據,我認爲你應該儘快進行重構。 – linepogl 2011-03-03 10:33:56