为什么Math.floor返回一个double?

官方javadoc 说 ,Math.floor返回一个“等于一个math整数”的double,但是为什么它不能返回一个int?

根据相同的javadoc:

如果参数是NaN或无穷大或正零或负零,则结果与参数相同。 不能用int来做到这一点。

最大的double值也比最大的int值大,所以它必须是很长的。

这是为了精确。 双数据types有一个53位的尾数。 除此之外,这意味着一个double可以代表所有2 ^ 53的整体,而不会造成精确度损失。

如果将这样一个大数字存储在一个整数中,您将会发生溢出。 整数只有32位。

以doubleforms返回整数是正确的做法,因为它提供了比整数更广泛的有用数字范围。

其他人已经告诉你为什么,我会告诉你如何正确舍入,因为你想这样做。 如果你只打算使用正数,那么你可以使用这个语句:

int a=(int) 1.5; 

然而,(int)总是向0进行舍入。因此,如果你想做一个负数:

 int a=(int) -1.5; //Equal to -1 

就我而言,我不想这样做。 我使用下面的代码来做舍入,它似乎很好地处理所有的边缘情况:

 private static long floor(double a) { return Math.round(Math.floor(a)); } 

如果你给它一个比最大的int还长的double,你会希望它返回吗?

(不可否认,如果它大于最大的长度,精度将会很低 – 它可能不是最接近的理论整数 – 但即便如此…)

所以,错误和其他非整数值可以正确地级联通过一系列的计算。

例如,如果您向Math.floor中input非数字(NaN),则会传递给它。

如果它返回整数,则不能传递这些状态或错误,而且您可能会从较早的计算中看到不好的结果,这些结果看起来不错,但是在进一步处理后是错误的。

-亚当

就像在Java中有一个整数和一个浮点除法一样,有整数和浮点的方式来做floor:

 double f = Math.floor(x); 

要么

 int k = (int) x; 

但是在使用有限精度算术的地板时,您总是需要小心:您对x的计算可能会产生类似于1.99999999的东西,这两种forms都会被置为1而不是2。 有很多algorithm需要解决这个限制,以避免对某些input值产生错误的结果。