可能重复:
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#中完成的 - 我还没有在其他情况下测试过。
答案 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