为什么当我将双精度与零进行比较时,Resharper 会抱怨
本文关键字:比较 Resharper 双精度 为什么 | 更新日期: 2023-09-27 18:34:53
如果我这样做
double d = 0;
if (d == 0) {
...
}
Resharper在比较d == 0
抱怨"浮点数与等式运算符的比较。舍入值时可能会损失精度。
为什么?将精确的零表示为双精度或浮点数并不困难,不是吗?
我了解,如果我与其他一些没有确切二进制表示的值(例如 0.2(进行比较,这样的警告将是相关的。
Resharper 不分析双精度变量是如何获得其值的。
经过几次计算后,双精度值很少是精确的,因此锐化器警告您将双精度值与精确值进行比较不是一个好主意。
double x = Math.Sqrt(2);
double d = x * x;
Console.WriteLine(d == 2);
自 R# 6 以来,许多此类检查在其 Alt+Enter 菜单上都有一个"为什么 ReSharper 建议这样做?"项。在这种情况下,解释与对浮点值进行相等比较可能产生的意外后果有关:
通常,使用
==
运算符比较浮点数是 一个坏主意。问题产生于这样一个事实,通常,结果 的计算必须"拟合"到浮点中 代表性,并不总是与感知的现实相匹配 应该产生什么结果。
通常使用双精度计算是不精确的。 将双精度值与精确值进行比较可能会有问题。与间隔进行比较可能更安全。
if ((d > -0.000001) && (d < +0.000001)) {
...
}
这同样适用于比较日期
if ((date >= DateTime.parse("2012-05-21T00:00:00")) &&
(date <= DateTime.parse("2012-05-21T23:59:59"))) {
}