基本 Java:判断双精度数是不是为整数的方法

Posted

技术标签:

【中文标题】基本 Java:判断双精度数是不是为整数的方法【英文标题】:Basic Java: Method to tell if a double is an integer基本 Java:判断双精度数是否为整数的方法 【发布时间】:2013-04-13 16:06:27 【问题描述】:

我是一名初级程序员,我需要一个方法来返回双精度数是否为整数。当数字太大而无法容纳 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 而无需像这样比较?

提前致谢!

【问题讨论】:

【参考方案1】:

long 的位数比 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 与最接近的整数的接近程度,并具有某种容差。

【讨论】:

这是什么意思 - 当你超出 long 的范围时,所有的 double 值都是整数(并且被超过 1 分隔)? @davidblaine 请参阅 JLS 的 Section 4.2.1 和 Section 4.2.3 以获得一些解释。【参考方案2】:

试试

boolean isInteger(double d) 
    return d % 1 == 0;

【讨论】:

我觉得这是最容易理解,也是最优雅的做法。它的语言也独立。 +1 为简单起见。【参考方案3】:

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

【讨论】:

【参考方案4】:

要存储较大的数字,您必须改用long。至于比较,你可以改用num == Math.round(num)

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

以上是关于基本 Java:判断双精度数是不是为整数的方法的主要内容,如果未能解决你的问题,请参考以下文章

检查双精度值是不是为整数 - Swift

将字符串转换为整数或双精度数

RESTful MySQL / 术语 / 传递参数 / 返回整数和双精度数

Java:将双精度数转换为字符串

是否可以保真地将浮点双精度数往返于两个十进制整数?

是否可以保真地将浮点双精度数往返于两个十进制整数?