如果我这样做了
double d = 0;
if (d == 0) {
...
}Resharper在比较d == 0上抱怨“浮点数与相等运算符的比较。舍入值时可能会损失精度。”
为什么?将精确的零表示为双精度型或浮点型并不难,不是吗?
我理解这样的警告是相关的,如果我将其与其他一些值进行比较,例如0.2,它没有确切的二进制表示。
发布于 2012-05-21 19:36:40
Resharper不会分析double变量是如何获得值的。
经过几次计算后,双精度值很少是精确的,因此resharper警告您,将双精度值与精确值进行比较不是一个好主意。
double x = Math.Sqrt(2);
double d = x * x;
Console.WriteLine(d == 2);发布于 2012-05-21 19:50:39
在他们的Alt+Enter菜单上显示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
使用
==运算符来比较浮点数通常不是一个好主意。问题产生于这样一个事实,即通常情况下,计算结果必须‘拟合’到浮点表示中,而浮点表示并不总是与应该产生什么结果的感知现实相匹配。
发布于 2012-05-21 19:38:47
通常,使用双精度计算是不精确的。将双精度数与精确值进行比较可能会有问题。与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"))) {
}https://stackoverflow.com/questions/10684365
复制相似问题