当我将双倍与零比较时,为什么Resharper会抱怨?

时间:2012-05-21 11:28:09

标签: c# floating-point resharper

如果我这样做

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

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

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

我理解如果我将某些其他值(例如0.2)与其中没有确切的二进制表示形式进行比较,则此警告是相关的。

3 个答案:

答案 0 :(得分:12)

Resharper不分析双变量如何得到它的值。

经过几次计算后,双精度值很少精确,所以resharper警告你,将双精度值与精确值进行比较并不是一个好主意。

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

Console.WriteLine(d == 2);

答案 1 :(得分:10)

Alt + Enter菜单上的

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

  

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

答案 2 :(得分:3)

经常用double计算是不精确的。将双精度值与精确值进行比较可能会有问题。与intervallmight相比,更安全。

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

比较日期

时的相同应用
if ((date >= DateTime.parse("2012-05-21T00:00:00")) && 
   (date <= DateTime.parse("2012-05-21T23:59:59"))) {
}