1

我是一名初级程序员,我需要一个方法来返回双精度数是否为整数。当数字太大而无法容纳 int 时,就会出现问题。

这是我所拥有的:

private static boolean isInteger(double n){
    int ni = (int) n;
    double nd = (double) ni;
    if (nd==n)
        return true;
    return false;
}

假设我输入了 143215890634.0。它将返回 false,因为 int 不能存储那么多数字。

如何允许 int(或其他类)存储更多数字,或者有没有更好的方法来确定 double 是否是 int 而无需像这样比较?

提前致谢!

4

5 回答 5

2

Welllong拥有比 更多的数字int。当您超出 的范围时long所有 double值都是整数(并且间隔大于 1)。所以你可以使用类似的东西:

private static boolean isInteger(double n) {
    if (n > (double) Long.MAX_VALUE ||  n < (double) Long.MIN_VALUE) {
        return true;
    }
    long asLong = (long) n;
    return n == (double) asLong;
}

有一些替代方法可以确定按位表示并检查指数 - 但它们会更复杂,至少要理解。

请注意,检查二进制浮点中的确切值通常是一个坏主意。相反,您可能想要检查double与最接近的整数的接近程度,并具有某种容差。

于 2013-04-13T16:12:34.307 回答
2

尝试

boolean isInteger(double d) {
    return d % 1 == 0;
}
于 2013-04-13T16:28:52.633 回答
0

将其与Integer.MAX_VALUE. 如果它更小 - 假设它没有分数,它将适合整数。

于 2013-04-13T16:11:16.067 回答
0

要存储更大的数字,您将不得不使用它long。至于比较,您也许可以这样做num == Math.round(num)

于 2013-04-13T16:13:38.877 回答
0

我想,这会比 Math.round() 更有效,因为它避免了类型提升:

    double d1 = 143215890634.0, d2 = 143215890634.001;
    System.out.println(d1 == Math.floor(d1));
    System.out.println(d2 == Math.floor(d2));

这有效,如果使用“整数”,您的意思不是实际类型“int”,而是“小数点后没有位置的数字”。

于 2013-04-13T16:18:34.540 回答