将两个双值相加时出现算术错误

本文关键字:错误 两个 | 更新日期: 2023-09-27 18:11:05

可能重复:
浮点不准确性示例
Java 中的二重算术与等式

我在调试一个检查两个值是否相等的排序例程时遇到了这个问题。获取这些值只需对两个双变量进行加法运算:0.31+0.27。

当排序将这两个对象的总和与另一些对象的总和进行比较时,它告诉我这种比较是不相等的。查看第一个对象的总和,我看到它将其列为0.58000000000000007。想知道这是否与我的代码有关,我创建了一个简单的控制台应用程序来测试它:

static void Main(string[] args)
    {
        double val1 = .31;
        double val2 = .27;
        Console.WriteLine("Value 1: " + val1);
        Console.WriteLine("Value 2: " + val2);
        double added = val1 + val2;
        if (!added.Equals(.58))
            Console.WriteLine("Added value is not .58!");
        else
            Console.WriteLine("Added value is .58");

        Console.WriteLine("Press any key to exit.");
        Console.ReadLine();
    }

在我的机器上运行它,结果又是50000000000000007。我让一位同事也做了同样的事情,得出了同样的结果。

以前有人见过这个吗?我们都在运行64位Windows7,这是在C#中完成的——我还没有在其他场景中测试过。

将两个双值相加时出现算术错误

这与.31.27没有精确的二进制表示有关。我觉得这篇文章很有用。

这是浮点精度的问题。你可以做的是将值乘以100(两个房屋的decmais精度(,并将其转换为int或long。因此,比较非常完美。

如果你想深入研究这个主题,可以搜索Stallings的计算机体系结构书。链接:http://williamstallings.com/

您需要定义ε或最大可接受错误。

double result = 0.27 + 0.31;
double expected = 0.58;
double epsilon = 0.000001;
bool areTheyEqual = Math.abs(expected - result) < epsilon
相关文章: