划分 double 时 C# 精度损失

标签 c# double precision

我知道这已经被讨论过一次又一次,但我似乎无法得到一个最简单的一步除 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/

相关文章:

c# - .NET MVC 应用程序中所有 HTTP GET 操作的 OnActionExecuted 代码

c# - 在设计器中打开自定义用户控件时,Visual Studio Professional 15.9.2 崩溃

java - 在没有 Round Java 的情况下从 double 转换为 long

swiftui - 使用双值识别 SwiftUI TextField 中的更改

c# - asp.net文件上传控件如何动态设置值?

javascript - 将表单 Ajax 发送到 Controller 错误 404 C#

c++ - 将 double 转换为数组的单个数字

c++ - 处理 float 不准确

math - float 学有问题吗?

scala - 为什么 0.29999999999999998 转换为 0.3?