将System.Double与“0”(数字,int?)进行比较的正确方法

对不起,这可能是一个简单的愚蠢的问题,但我需要知道的确定。

我有这个表情,

 void Foo() { System.Double something = GetSomething(); if (something == 0) //Comparison of floating point numbers with equality // operator. Possible loss of precision while rounding value {} } 

这个expression与之相等吗?

 void Foo() { System.Double something = GetSomething(); if (something < 1) {} } 

? 因为那么我可能会遇到问题,例如input值为0.9的if

那么,你需要接近0的值多近? 如果你经历了大量的“无限精度”的浮点运算,可能会导致0,你可能会得到一个“非常接近”0的结果。

通常在这种情况下,你想提供某种types的epsilon,并检查结果是否在该epsilon:

 if (Math.Abs(something) < 0.001) 

你应该使用的epsilon是特定于应用程序的 – 这取决于你在做什么。

当然,如果结果应该完全为零,那么简单的相等检查就可以了。

你的somethingdouble ,你已经正确地确定了这一行

 if (something == 0) 

我们在左边(lhs)有一个double ,在右边有一个int (rhs)。

但是现在看起来你认为lhs会被转换为int ,然后==符号会比较两个整数。 这不是什么事情。 double int的转换是显式的 ,不能“自动”发生。

相反,恰恰相反。 rhs被转换为double ,然后==符号成为两个双打之间的平等testing。 这个转换是隐含的(自动的)。

写(被某些人认为是更好的)

 if (something == 0.0) 

要么

 if (something == 0d) 

因为那么你直接比较两个双打。 但是,这只是风格和可读性的问题,因为编译器在任何情况下都会做同样的事情。

在某些情况下,引入Jon Skeet的答案中的“宽容”也是相关的,但是宽容也是double 。 如果你想要,它当然可以是1.0 ,但它不一定是[最不严格的正数]整数。

如果从某个操作的结果中分配了something = 0那么你最好使用:

 if(Math.Abs(something) < Double.Epsilon) { //do something } 

如果您只是想压制警告,请执行以下操作:

 if (something.Equals(0.0)) 

当然,如果你知道漂移不是一个问题,这只是一个有效的解决scheme。 我经常这样做来检查我是否要除以零。

老实说,我不认为这是平等的。 考虑你自己的例子:东西= 0.9或0.0004。 在第一种情况下它将是假的,在第二种情况下它将是真的。 处理这种types我通常为我定义精度百分比,并在该精度内进行比较。 取决于你的需求。 就像是…

 if(((int)(something*100)) == 0) { //do something } 

希望这可以帮助。