为什么当我将双精度与零进行比较时,Resharper 会抱怨

本文关键字:比较 Resharper 双精度 为什么 | 更新日期: 2023-09-27 18:34:53

如果我这样做

double d = 0;
if (d == 0) {
  ...
}

Resharper在比较d == 0抱怨"浮点数与等式运算符的比较。舍入值时可能会损失精度。

为什么?将精确的零表示为双精度或浮点数并不困难,不是吗?

我了解,如果我与其他一些没有确切二进制表示的值(例如 0.2(进行比较,这样的警告将是相关的。

为什么当我将双精度与零进行比较时,Resharper 会抱怨

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"))) {
}