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

时间:2009-03-12 12:21:39

标签: c# floating-point isinteger

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

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

但哪种方法最可靠?

6 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

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

有关您应该注意的浮点的各种问题的完美摘要,我建议您查看"What Every Computer Scientist Should Know About Floating-Point Arithmetic"

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

floatingPoint = 1.0/3.0;
floatingPoint *= 3;

你最终会得到一些接近但不完全合适的东西。

答案 4 :(得分:1)

没有通常可靠的方法。

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

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

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

答案 5 :(得分:0)

整数可以用浮点表示完全表示,所以如果你要检查一个完整的整数,那么任何一个都可以工作(我个人会使用第一个...)