18

如果我做

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

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

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

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

4

3 回答 3

12

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

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

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

Console.WriteLine(d == 2);
于 2012-05-21T11:36:40.277 回答
10

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

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

于 2012-05-21T11:50:38.790 回答
4

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

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

比较日期时同样适用

if ((date >= DateTime.parse("2012-05-21T00:00:00")) && 
   (date <= DateTime.parse("2012-05-21T23:59:59"))) {
}
于 2012-05-21T11:38:47.163 回答