2011-10-10 40 views
1

可能重复:
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#中完成的 - 我还没有在其他场景中测试过它。

+1

这是由于浮点类型的工作原因。使用'decimal'而不是double。 –

+3

我相信这已经得到解答,但我找不到那个笨蛋。这是正确的行为。我建议你阅读[Goldberg的计算机科学家应该知道的关于浮点运算的知识](http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html)。 – user7116

+0

太多重复。长话短说,不是bug。 –

回答

4

这与.31.27没有确切的二进制表示形式有关。我发现this article有用。

1

这是浮点精度的问题。你所能做的就是把这个值乘以100(两个房子的十分准确度),并将一个演员阵容变成int或long。所以比较运行完美。

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

0

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

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