官方Javadoc 表示,Math.floor()
返回一个“等于数学整数”的double
,但为什么它不返回一个int
呢?
根据同样的Javadoc:
如果参数是NaN
、无穷大或正零或负零,则结果与参数相同。使用int
无法实现这一点。
最大的double
值也比最大的int
值更大,因此必须使用long
。
这是为了精度。双精度数据类型具有53位尾数。这意味着,不会丢失精度的情况下,双精度可以表示所有小于2^53的整数。
如果您将这样一个大数存储为整数,则会发生溢出。整数只有32位。
在此处将整数返回为双精度浮点值是正确的,因为它提供了比整数更广泛和有用的数字范围。
其他人已经告诉你为什么要这样做,我将告诉你如何正确地四舍五入。如果你只需要使用正数,那么可以使用以下语句:
int a=(int) 1.5;
然而,(int) 总是向0舍入。因此,如果您想处理负数:
int a=(int) -1.5; //Equal to -1
在我的情况下,我不想这样做。我使用以下代码进行四舍五入,看起来它可以很好地处理所有边缘情况:private static long floor(double a)
{
return (int) Math.floor(a);
}
(int) Math.floor(a)
呢?这可能更有效率也更简短。 - Solomon Uckodouble f = Math.floor(x);
或者
int k = (int) x;
但是,在使用有限精度算术时,您始终需要小心地使用floor函数:您计算的x可能会产生类似于1.99999999的结果,这将被两种形式的floor函数截断为1而不是2。有许多算法需要解决这个限制,以避免为某些输入值产生错误的结果。
(int) myFloatVar
来实现。 - Sujit