如果我这样做
double d = 0;
if (d == 0) {
...
}
Resharper在比较d == 0
时抱怨“浮点数与相等运算符的比较。在舍入值时可能会损失精度。”
为什么呢?将双精度值或浮点数表示为精确零值并不困难吗?
我理解如果我将某些其他值(例如0.2)与其中没有确切的二进制表示形式进行比较,则此警告是相关的。
答案 0 :(得分:12)
Resharper不分析双变量如何得到它的值。
经过几次计算后,双精度值很少精确,所以resharper警告你,将双精度值与精确值进行比较并不是一个好主意。
double x = Math.Sqrt(2);
double d = x * x;
Console.WriteLine(d == 2);
答案 1 :(得分:10)
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"))) {
}