对不起,这可能是一个简单的愚蠢问题,但我需要知道确定.
我有这个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是特定于应用程序的 - 它取决于您正在做什么.
当然,如果结果应该正好为零,那么简单的相等检查就可以了.
son*_*que 31
如果something已从除此之外的操作结果中分配,something = 0则最好使用:
if(Math.Abs(something) < Double.Epsilon)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
编辑:这段代码错了.Epsilon是最小的数字,但不是很零.当您希望将数字与另一个数字进行比较时,您需要考虑可接受的容差.让我们说你不关心的任何超出.00001的东西.这就是你要使用的数字.该值取决于域.然而,它绝大多数肯定不会Double.Epsilon.
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)
当然,如果你知道漂移不是一个问题,这只是一个有效的解决方案.我经常这样做,以检查我是否要除以零.
老实说,我不认为这是平等的。考虑您自己的示例:= 0.9或0.0004。第一种情况为FALSE,第二种情况为TRUE。我通常会为我处理这种类型的精度百分比,并在该精度范围内进行比较。取决于您的需求。就像是...
if(((int)(something*100)) == 0) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。