检查浮点变量是否为整数的最可靠方法是什么?

我可以想到几种方法,例如。

Convert.ToInt32(floatingPoint) - floatingPoint == 0; Math.Truncate(floatingPoint) - floatingPoint == 0; floatingPoint % 1 == 0; Math.Floor(floatingPoint) == floatingPoint; //etc... 

但哪种方法最可靠?

您不应检查精确相等为零,因为浮点数通常仅包含与您分配给它的数字最接近的可能近似值。

例如,类型可能表示的最接近42的值可能类似于42.00000000000000662,您仍然希望将其计为整数值。

取值和舍入值之间的差值,然后取其值的绝对值(这样它不是负值)并比较一个小值:

 if (Math.Abs(Math.Round(floatingPoint) - floatingPoint) < 0.000001) ... 

浮点不能完全代表某些整数,因此没有真正可靠的方法 。 具体来说,任何大于2 ^ 24的int都不能用float精确表示。 唉,这是您使用浮点表示支付的价格的一部分!

有关您应该注意的浮点问题的一个很好的总结,我建议您查看“每个计算机科学家应该知道的关于浮点算术的内容” 。

无论可靠性如何,模数方法看起来都很容易理解(无需读取任何规范)和快速(无函数调用)。

您将遇到浮点数仅为近似值的经典问题。 如果你这样做:

 floatingPoint = 1.0/3.0; floatingPoint *= 3; 

你会得到一些接近但不完全是1的东西。

通常没有可靠的方法。

由于浮点数(大多数)总是近似,如果它们是先前计算的结果,则没有简单的整数等价,正如其他人所指出的那样。

您必须考虑您正在处理的fp和int值的范围精度 。 这一切都取决于你想要达到的目标。

Guffa有一个很好的方法,使用允许的精度范围进行int比较。

整数可以用浮点表示完全表示,所以如果你检查一个完整的整数,任何这些都应该有用(我个人用的是第一个…)