为什么这个两个双精度数的简单计算不准确?

5

可能是重复问题:
C# (4):double minus double giving precision problems

86.25 - 86.24 = 0.01,通常情况下,我认为以上说法是正确的,对吗?

然而,如果我输入以下代码:

        double a = 86.24;
        double b = 86.25;
        double c = b - a;

我发现c = 0.010000000000005116
为什么会这样?

我在询问为什么它存在,就是它背后发生了什么导致它会出现这种情况? - Diskdrive
2个回答

7
浮点数(在此情况下为双精度浮点数)无法准确表示十进制值。我建议阅读 David Goldberg 的《关于浮点算术,每个计算机科学家都应该知道什么》(链接:What every computer scientist should know about floating-point arithmetic)。这适用于处理浮点数的所有语言,无论是 C#、Java 还是 JavaScript,对于任何使用浮点算术的开发人员来说,这都是必读的。
正如 VinayC 所建议的那样,如果您需要一个精确(但速度较慢)的表示,请改用 System.Decimal(在 C# 中称为 decimal)。

既然您提到了各种编程语言,我必须指出Ada在允许您指定所需实数精度方面是独一无二的(例如,类型Happiness是数字7范围0.0..1.0),并且还允许固定精度实数值,例如type Compass_Direction is delta 0.1 0 .. 359.9,其精度在其范围内完全不变。 - TamaMcGlinn

1

Double类型不是用于小数计算的正确数据类型,应该使用Decimal类型。主要原因在于double类型存储数字的方式 - 它本质上是十进制数字的二进制近似值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接