C#双精度减法应= 0

时间:2019-05-07 02:33:42

标签: c# precision

我已经阅读了几篇文章,并且我了解了双重算术并不总是返回您期望的结果。

Why is floating point arithmetic in C# imprecise?

尽管我的问题有所不同,因为我正在检查两个数字是否相同,并且当我期望为真时我会得到假。

我也读过这个What Every Computer Scientist Should Know About Floating-Point Arithmetic,但是仍然很难理解为什么两个看似相等的double变量显示不相等。

enter image description here

更新:他们在下面的回答有助于我理解调试器显示的值不是“整个故事”。这就是为什么两个浮子看起来相等。悬停变量时,调试器显示相等的值。

enter image description here

1 个答案:

答案 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);