我已经阅读了几篇文章,并且我了解了双重算术并不总是返回您期望的结果。
Why is floating point arithmetic in C# imprecise?
尽管我的问题有所不同,因为我正在检查两个数字是否相同,并且当我期望为真时我会得到假。
我也读过这个What Every Computer Scientist Should Know About Floating-Point Arithmetic,但是仍然很难理解为什么两个看似相等的double变量显示不相等。
更新:他们在下面的回答有助于我理解调试器显示的值不是“整个故事”。这就是为什么两个浮子看起来相等。悬停变量时,调试器显示相等的值。
答案 0 :(得分:1)
默认字符串格式不适合浮点数,应使用"G17"
double a = 17.125 / 3.0;
double b = 17.12499999999999 / 3.0;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(a.ToString("G17"));
Console.WriteLine(b.ToString("G17"));
Console.WriteLine(a == b);
Console.WriteLine(Convert.ToString(*(long*)&a, 2));
Console.WriteLine(Convert.ToString(*(*)&b, 2));
结果:
5.70833333333333
5.70833333333333
5.7083333333333 33
5.7083333333333 295
错误
100000000010110110101010101010101010101010101010101010101010 101
100000000010110110101010101010101010101010101010101010101010 001
通常比较2个浮点数,可以使用一个小的错误数
Console.WriteLine(Math.Abs(a - b) < 0.0000001);