首页 > 解决方案 > C# 双精度减法应该 = 0

问题描述

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

为什么 C# 中的浮点运算不精确?

不过,我的问题有所不同,因为我正在检查两个数字是否相同,而当我期望为真时,我却错了。

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

在此处输入图像描述

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

在此处输入图像描述

标签: c#precision

解决方案


默认字符串格式对于浮点数不精确,应使用"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
False
100000000010110110101010101010101010101010101010101010101010 101
100000000010110110101010101010101010101010101010101010101010 001

通常比较 2 个浮点数,可以使用一个小的错误数

Console.WriteLine(Math.Abs(a - b) < 0.0000001);

推荐阅读