BCS*_*BCS 18 c# floating-point numerical
这段代码有效(C#3)
double d;
if(d == (double)(int)d) ...;
Run Code Online (Sandbox Code Playgroud)
注意:有几个人指出(重要的)点= =经常有问题重新浮点数.在这种情况下,我期望值在0到几百的范围内,它们应该是整数(非整数是错误),所以如果这些点"不应该"对我来说是一个问题.
小智 29
d == Math.Floor(d)
Run Code Online (Sandbox Code Playgroud)
换句话说,做同样的事情.
注意:希望你知道做这种事情时你必须非常小心; 浮点/双打很容易积累微小的错误,使得精确的比较(如此)失败没有明显的原因.
如果你的双倍是另一个计算的结果,你可能想要这样的东西:
d == Math.Floor(d + 0.00001);
Run Code Online (Sandbox Code Playgroud)
这样,如果出现轻微的舍入错误,它仍将匹配.
我不能回答问题的C#特定部分,但我必须指出你可能错过了浮点数的一般问题.
通常,浮点数上没有很好地定义整数.出于同样的原因,在浮点数上没有很好地定义相等性.浮点计算通常包括舍入和表示错误.
例如,1.1 + 0.6 != 1.7.
是的,这就是浮点数的工作方式.
在这里,1.1 + 0.6 - 1.7 == 2.2204460492503131e-16.
严格来说,与浮点数相比,最接近相等比较的是将它们与选定的精度进行比较.
如果这还不够,则必须使用十进制数表示,具有内置错误范围的浮点数表示或符号计算.