将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是特定于应用程序的 – 这取决于你在做什么。
当然,如果结果应该完全为零,那么简单的相等检查就可以了。
你的something
是double
,你已经正确地确定了这一行
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 }
希望这可以帮助。