检查浮点变量是否为整数的最可靠方法是什么?
我可以想到几种方法,例如。
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比较。
整数可以用浮点表示完全表示,所以如果你检查一个完整的整数,任何这些都应该有用(我个人用的是第一个…)