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

tom*_*msv 19 c# floating-point resharper

如果我做

double d = 0;
if (d == 0) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

Resharper在比较中抱怨d == 0"浮点数与等式运算符的比较.在舍入值时可能会损失精度."

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

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

adr*_*anm 12

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

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

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

Console.WriteLine(d == 2);
Run Code Online (Sandbox Code Playgroud)


Aak*_*shM 10

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

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