算术错误添加两个双值
问题描述:
时
可能重复:
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#中完成的 - 我还没有在其他场景中测试过它。
答
这是浮点精度的问题。你所能做的就是把这个值乘以100(两个房子的十分准确度),并将一个演员阵容变成int或long。所以比较运行完美。
如果您想深入研究计算机体系结构的Stallings书的搜索主题。链接:http://williamstallings.com/
答
您需要定义一个epsilon或最大可接受的错误。
double result = 0.27 + 0.31;
double expected = 0.58;
double epsilon = 0.000001;
bool areTheyEqual = Math.abs(expected - result) < epsilon
这是由于浮点类型的工作原因。使用'decimal'而不是double。 –
我相信这已经得到解答,但我找不到那个笨蛋。这是正确的行为。我建议你阅读[Goldberg的计算机科学家应该知道的关于浮点运算的知识](http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html)。 – user7116
太多重复。长话短说,不是bug。 –