我明白这个问题背后的原理,但它让我很头痛,认为这在整个我的应用程序中都在发生,我需要找到解决方案。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