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

rad*_*byx 82 c# compare

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

我有这个if表达,

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

这个表达是否与...相等

void Foo()
{
    System.Double something = GetSomething();
    if (something < 1)
        {}
}
Run Code Online (Sandbox Code Playgroud)

?因为那时我可能会遇到问题,输入if例如0.9的值.

Jon*_*eet 103

那么,您需要将该值与0接近?如果你经历了很多浮点运算,在"无限精度"中可能会得到0,你可能会得到一个"非常接近"0的结果.

通常在这种情况下,您希望提供某种类型的epsilon,并检查结果是否在该epsilon中:

if (Math.Abs(something) < 0.001)
Run Code Online (Sandbox Code Playgroud)

您应该使用的epsilon是特定于应用程序的 - 它取决于您正在做什么.

当然,如果结果应该正好为零,那么简单的相等检查就可以了.

  • @radbyx:只需使用`== 0`.你有一个文字 - 那是非常稳定的:) (23认同)
  • 很感谢.我想我做得比以前更难.:) (3认同)

son*_*que 31

如果something已从除此之外的操作结果中分配,something = 0则最好使用:

if(Math.Abs(something) < Double.Epsilon)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)

编辑:这段代码错了.Epsilon是最小的数字,但不是很零.当您希望将数字与另一个数字进行比较时,您需要考虑可接受的容差.让我们说你不关心的任何超出.00001的东西.这就是你要使用的数字.该值取决于域.然而,它绝大多数肯定不会Double.Epsilon.

  • Double.Epsilon对于这样的比较来说太小了.Double.Epsilon是double可以表示的最小正数. (6认同)
  • 这没有任何意义,因为它与0 -1的比较实际上是相同的 (3认同)
  • @MaurGi:你错了:`double d = Math.Sqrt(10100)*2; double a = Math.Sqrt(40400); if(Math.Abs​​(a - d)<double.Epsilon){Console.WriteLine("true"); }` (3认同)
  • 这并不能解决舍入问题,例如`Math.Abs​​(0.1f - 0.1d)<double.Epsilon`是'false` (2认同)

Jep*_*sen 22

something是一个double,你已经在行中正确识别出来了

if (something == 0)
Run Code Online (Sandbox Code Playgroud)

我们double在左侧(lhs)和int右侧(rhs)有一个.

但现在看起来你认为lhs会被转换为a int,然后这个==符号会比较两个整数.这不是发生的事情.转换 double int明确的,不能发生"自动".

相反,恰恰相反.rhs被转换为double,然后==符号成为两个双打之间的相等测试.此转换是隐式的(自动).

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

if (something == 0.0)
Run Code Online (Sandbox Code Playgroud)

要么

if (something == 0d)
Run Code Online (Sandbox Code Playgroud)

因为那时你就是在比较两个双打.然而,这只是风格和可读性的问题,因为编译器在任何情况下都会做同样的事情.

在某些情况下,在Jon Skeet的答案中引入"容忍度"也是相关的,但这种容忍度double也是如此.它可能的当然是1.0,如果你想要的,但它并没有为[最小严格正]整数.


Rus*_*ips 15

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

if (something.Equals(0.0))
Run Code Online (Sandbox Code Playgroud)

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


Tig*_*ran 5

老实说,我不认为这是平等的。考虑您自己的示例:= 0.9或0.0004。第一种情况为FALSE,第二种情况为TRUE。我通常会为我处理这种类型的精度百分比,并在该精度范围内进行比较。取决于您的需求。就像是...

if(((int)(something*100)) == 0) {


//do something
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

  • 某些东西必须正好为零。 (2认同)