1

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

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

但哪种方法最可靠?

4

6 回答 6

5

您不应该检查是否完全等于零,因为浮点数通常只包含与您分配给它的数字最接近的可能近似值。

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

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

if (Math.Abs(Math.Round(floatingPoint) - floatingPoint) < 0.000001) ...
于 2009-03-12T12:31:24.373 回答
2

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

有关您应该注意的各种浮点问题的精彩总结,我鼓励您查看“每个计算机科学家应该了解的关于浮点运算的知识”

于 2009-03-12T12:27:27.423 回答
1

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

于 2009-03-12T12:25:18.723 回答
1

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

floatingPoint = 1.0/3.0;
floatingPoint *= 3;

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

于 2009-03-12T12:25:31.143 回答
1

没有普遍可靠的方法。

由于浮点数(大部分)总是近似值,如果它们是先前计算的结果,则不存在简单的整数等价,正如其他人指出的那样。

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

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

于 2009-03-12T12:39:15.040 回答
0

整数可以用浮点表示精确表示,因此如果您正在检查一个精确的整数,其中任何一个都应该工作(我个人会使用第一个......)

于 2009-03-12T12:47:26.427 回答