我可以想到几种方法,例如。
Convert.ToInt32(floatingPoint) - floatingPoint == 0;
Math.Truncate(floatingPoint) - floatingPoint == 0;
floatingPoint % 1 == 0;
Math.Floor(floatingPoint) == floatingPoint;
//etc...
但哪种方法最可靠?
答案 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)
整数可以用浮点表示完全表示,所以如果你要检查一个完整的整数,那么任何一个都可以工作(我个人会使用第一个...)