c# - C# 双精度减法应该 = 0
问题描述
我已经阅读了几篇文章,并且了解双重算术并不总是返回您期望的结果。
不过,我的问题有所不同,因为我正在检查两个数字是否相同,而当我期望为真时,我却错了。
我也读过What Every Computer Scientist Should Know About Floating-Point Arithmetic,但我仍然无法理解为什么两个看似相等的双变量显示不相等。
更新:他们在下面的回答帮助我理解调试器显示的值不是“整个故事”。这就是为什么两个花车看起来相等的原因。悬停变量时调试器显示相同的值。
解决方案
默认字符串格式对于浮点数不精确,应使用"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);
推荐阅读
- c# - 如何在 ASP.NET MVC 中设置多语言和本地化视图?
- javascript - 重组重复组件以在地图函数中呈现
- java - 如何使用 Spring 注释输出/序列化正确的 YearMonth 值以显示在表单上?
- tableau-api - 计算字段以求和两个值 Tableau
- python - 是否可以通过过滤生成列表?
- javascript - 如何将 Calandly 小部件嵌入到 Angular 应用程序中?
- react-testing-library - 材料ui文本输入的react-testing-library
- google-analytics - Google Analytics API:报告维度和指标为空
- azure-devops - Azure DevOps - 授予管道权限以使用 REST API 访问 git 存储库
- python - 如何从 json.dumps (python) 获取“对象数组”