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