我可以想到几种方法,例如。
Convert.ToInt32(floatingPoint) - floatingPoint == 0;
Math.Truncate(floatingPoint) - floatingPoint == 0;
floatingPoint % 1 == 0;
Math.Floor(floatingPoint) == floatingPoint;
//etc...
但哪种方法最可靠?
我可以想到几种方法,例如。
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) ...
浮点数不能准确地表示某些整数,所以没有真正可靠的方法。具体来说,任何int
大于 2^24 的都不能用 a 精确表示float
。唉,这是您使用浮点表示所付出的代价的一部分!
有关您应该注意的各种浮点问题的精彩总结,我鼓励您查看“每个计算机科学家应该了解的关于浮点运算的知识”。
不管可靠性如何,取模方法看起来很容易理解(无需阅读任何规范)和快速(无需函数调用)。
您将遇到浮点数只是近似值的经典问题。如果你这样做:
floatingPoint = 1.0/3.0;
floatingPoint *= 3;
你最终会得到接近但不完全是 1 的东西。
没有普遍可靠的方法。
由于浮点数(大部分)总是近似值,如果它们是先前计算的结果,则不存在简单的整数等价,正如其他人指出的那样。
您必须考虑您正在处理的 fp 和 int 值的范围和精度。这完全取决于您要达到的目标。
Guffa 有一个很好的方法,使用允许的精度范围进行 int 比较。
整数可以用浮点表示精确表示,因此如果您正在检查一个精确的整数,其中任何一个都应该工作(我个人会使用第一个......)