我知道这已经被讨论过一次又一次,但我似乎无法得到一个最简单的一步除 double 的例子来在 C# 中产生预期的、未舍入的结果——所以我想知道是否可能有一些编译器标志或其他我没有想到的奇怪的东西。考虑这个例子:
double v1 = 0.7;
double v2 = 0.025;
double result = v1 / v2;
当我在最后一行后中断并在 VS 调试器中检查它时,“结果”的值为 27.999999999999996。我知道我可以通过更改为“十进制”来解决它,但是对于周围的程序来说这是不可能的。像这样的两个低精度 double 不能除以正确的值 28,这不奇怪吗? Math.Round 结果真的是唯一的解决方案吗?
最佳答案
Is it not strange that two low-precision doubles like this can't divide to the correct value of 28?
不,不是真的。 0.7 和 0.025 都不能用 double
类型精确表示。涉及的确切值是:
0.6999999999999999555910790149937383830547332763671875
0.025000000000000001387778780781445675529539585113525390625
现在您是否对除法给出的不是恰好 28 感到惊讶?垃圾进,垃圾出...
如您所说,准确表示十进制 数字的正确结果是使用decimal
。如果您的程序的其余部分使用了错误的类型,这仅意味着您需要计算出哪个更高:获得错误答案的成本或更改整个程序的成本。
关于划分 double 时 C# 精度损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10444350/