为什么Math.floor会返回一个双精度数?

时间:2009-02-04 15:47:31

标签: java math types

官方Javadoc says Math.floor()返回一个“等于数学整数”的double,但为什么它不能返回int

6 个答案:

答案 0 :(得分:72)

根据同一个Javadoc:

如果参数为NaN或无穷大或正零或负零,则结果与参数相同。使用int无法做到这一点。

最大double值也大于最大int,因此它必须是long

答案 1 :(得分:14)

这是为了精确。双数据类型具有53位尾数。除此之外,这意味着double可以代表所有整体,最多2 ^ 53而不会出现精度损失。

如果在整数中存储如此大的数字,则会出现溢出。整数只有32位。

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

答案 2 :(得分:6)

其他人告诉你为什么,我会告诉你如何正确地打圆,因为你想要这样做。如果您只想使用正数,那么您可以使用以下语句:

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);
}

答案 3 :(得分:3)

如果你给它一个大于最大int或long的双倍,你想要它返回什么?

(无论如何,如果它大于最大长度,则精度将会低 - 它可能不是最接近的理论整数 - 但即便如此......)

答案 4 :(得分:0)

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

例如,如果您将非数字(NaN)提供给Math.floor,它将传递它。

如果它返回整数,则无法传递这些状态或错误,并且您可能会因先前的计算结果看起来不错但在进一步处理后出错而得到错误结果。

- 亚当

答案 5 :(得分:0)

正如Java中存在整数和浮点除法一样,有整数和浮点方式来做底板:

double f = Math.floor(x);

int k = (int) x; 

但是你总是需要小心使用有限精度算术的地板:你的x的计算可能会产生类似于1.99999999的东西,它将被两个形式的2而不是2。有许多算法需要解决这个限制,以避免对某些输入值产生错误的结果。