为什么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值产生错误的结果。