当我将双倍与零比较时,为什么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"))) { }