【问题标题】:Why does Resharper complain when I compare a double to zero?当我将双精度数与零进行比较时,为什么 Resharper 会抱怨?
【发布时间】:2012-05-21 11:28:09
【问题描述】:

如果我这样做

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

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

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

我知道,如果我与没有精确二进制表示的其他值(例如 0.2)进行比较,这样的警告将是相关的。

【问题讨论】:

  • 我不知道,但是如果你比较if (d == 0.0)会发生什么?会更没用,但会是双倍的。
  • 请删除更多无用的标签,如零并添加您的语言。谢谢

标签: c# floating-point resharper


【解决方案1】:

Resharper 没有分析 double 变量是如何得到它的值的。

经过几次计算后,double 值很少是精确的,因此 resharper 警告您,将 double 值与精确值进行比较不是一个好主意。

double x = Math.Sqrt(2);
double d = x * x;

Console.WriteLine(d == 2);

【讨论】:

    【解决方案2】:

    Since R# 6, many such inspections have a 'Why is ReSharper suggesting this?' item 在他们的 Alt+Enter 菜单上。在这种情况下,the explanation relates to the possible unintended consequences of doing equality comparisons on floating point values

    使用== 运算符比较浮点数通常是 一个坏主意。问题源于这样一个事实,通常,结果 的计算必须“拟合”到浮点数中 表示,并不总是与感知到的现实相匹配 应该产生什么结果。

    【讨论】:

      【解决方案3】:

      通常使用双精度计算是不精确的。将双精度值与精确值进行比较可能会有问题。与区间比较可能更安全。

      if ((d > -0.000001) && (d < +0.000001)) {
         ...
      }
      

      比较日期时也是如此

      if ((date >= DateTime.parse("2012-05-21T00:00:00")) && 
         (date <= DateTime.parse("2012-05-21T23:59:59"))) {
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-21
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-01
        • 1970-01-01
        • 2022-08-02
        相关资源
        最近更新 更多