添加两个double值时的算术错误

时间:2011-10-10 23:19:44

标签: c# math 64-bit

  

可能重复:
  Floating point inaccuracy examples
  double arithmetic and equality in Java

我在尝试调试检查两个值是否相等的排序例程时遇到了这个问题。获取值只是在两个双变量上做了一些补充:0.31 + 0.27。

当排序将这两者的总和与另一些物体的总和相比较时,其总和也等于0.58,它告诉我比较不相等。看着第一个对象的总和,我看到它将它列为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();
    }

把它放在我的机器上,再次是0.58000000000000007。我有一个同事做同样的事情,并得出了相同的输出。

有没有人遇到过这个?我们都运行64位Windows 7,这是在C#中完成的 - 我还没有在其他情况下测试过。

3 个答案:

答案 0 :(得分:4)

这与.31.27没有精确二进制表示的事实有关。我发现this article很有用。

答案 1 :(得分:1)

这是浮点精度的问题。你可以做的是将值乘以100(两个房子的十分准确度)并将一个转换为int或long。因此比较完美。

如果您想深入研究Stallings计算机体系结构书籍的主题。链接:http://williamstallings.com/

答案 2 :(得分:0)

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

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