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

如果我做

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

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

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

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

Resharper不分析双变量如何获得其值。

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

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

自R#6以来,许多此类检查都有一个’为​​什么ReSharper暗示这个?’ Alt + Enter菜单上的项目。 在这种情况下, 解释涉及对浮点值进行相等比较可能产生的意外后果 :

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

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