C#Maths给出了错误的结果!

cus*_*ar9 2 c# math floating-point division

我理解这个问题背后的原理,但是让我头疼的是认为这在整个应用程序中都会发生,我需要找到解决方案.

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
Run Code Online (Sandbox Code Playgroud)

我用双打代表很小的数字.不知何故,在计算141.1-35.275中,结果的二进制表示给出了一个仅为0.0000000000001的数字.不幸的是,由于我正在舍入这个数字,这给出了错误的答案.

我已经阅读过使用Decimals而不是Doubles,但我不能用Decimal替换Double的每个实例.有没有更简单的方法来解决这个问题?

Jon*_*eet 16

如果您正在寻找自然十进制值的精确表示,需要替换doubledecimal无处不在.您只是使用了错误的数据类型.如果你一直在使用short整数,然后发现你需要应对比支持更大的值,你会怎么做?这是同样的交易.

但是,你应该真正试着去了解一下开始的事情......例如,为什么Value并不完全等于141.1.

我有两篇文章: