【问题标题】:Checking if a number is an Integer in Java检查数字是否是Java中的整数
【发布时间】:2011-07-27 00:43:23
【问题描述】:

有没有什么方法或快速的方法来检查一个数字在Java中是否是一个整数(属于Z字段)?

我想也许可以从四舍五入的数字中减去它,但我没有找到任何可以帮助我解决这个问题的方法。

我应该在哪里检查?整数 API?

【问题讨论】:

  • 您正在从字符串中解析数字,或者您已经有某个浮点数或双精度数?
  • “属于Z领域”是什么意思?
  • 我有任何数字,它也可以是 float ir double。
  • Z字段-表示它是整数。
  • @ntt:N = 自然数,Z = 整数,Q = 有理数,R = 实数,C = 复数

标签: java utilities


【解决方案1】:

又快又脏……

if (x == (int)x)
{
   ...
}

edit:这是假设 x 已经是其他数字形式。如果您正在处理字符串,请查看Integer.parseInt

【讨论】:

  • 通常我有一个函数isInteger(),它尝试捕获Integer.parseInt,如果发生异常则返回false。
  • 这是一个很好的答案,我为此投了赞成票——但是,请确保您了解浮点表示的局限性!
  • 最初这个解决方案对我不起作用,但它在这个谨慎的情况下使用它:if (x.intValue() == x.doubleValue()) {}
【解决方案2】:

对于 Z,我假设您的意思是 Integers ,即 3,-5,77 而不是 3.14, 4.02 等。

正则表达式可能会有所帮助:

Pattern isInteger = Pattern.compile("\\d+");

【讨论】:

【解决方案3】:

如果您在谈论浮点值,由于格式的性质,您必须非常小心。

据我所知,最好的方法是确定某个 epsilon 值,例如 0.000001f,然后执行以下操作:

boolean nearZero(float f)
{
    return ((-episilon < f) && (f <epsilon)); 
}

然后

if(nearZero(z-(int)z))
{ 
    //do stuff
}

本质上,您正在检查 z 和 z 的整数大小写是否在某个容差范围内具有相同的大小。这是必要的,因为浮动本质上是不精确的。

注意,但是:如果您的浮点数大于Integer.MAX_VALUE (2147483647),这可能会中断,并且您应该知道,必须不可能检查高于该值的浮点数的完整性。

【讨论】:

  • +1:对于大于 2^24(约 1600 万)的整数,您会在 float 上获得舍入错误如果您使用 double,对于大于 2^53(8百万万亿)
【解决方案4】:

还有一个例子:)

double a = 1.00

if(floor(a) == a) {
   // a is an integer
} else {
   //a is not an integer.
}

在此示例中,可以使用 ceil 并具有完全相同的效果。

【讨论】:

    【解决方案5】:

    将 x 更改为 1 并且输出为整数,否则它不是整数添加到计数示例整数、十进制数等。

       double x = 1.1;
       int count = 0;
       if (x == (int)x)
        {
           System.out.println("X is an integer: " + x);
           count++; 
           System.out.println("This has been added to the count " + count);
        }else
       {
           System.out.println("X is not an integer: " + x);
           System.out.println("This has not been added to the count " + count);
    
    
       }
    

    【讨论】:

      【解决方案6】:
          if((number%1)!=0)
          {
              System.out.println("not a integer");
          }
          else
          {
              System.out.println("integer");
          }
      

      【讨论】:

      • 注意 Java 中的浮点数和双精度数,它们(缺乏)精度会导致问题。使用 BigDecimal
      • @PabloLozano 我不明白你的担忧,你能用一些例子解释你的评论吗?
      【解决方案7】:
       int x = 3;
      
       if(ceil(x) == x) {
      
        System.out.println("x is an integer");
      
       } else {
      
        System.out.println("x is not an integer");
      
       }
      

      【讨论】:

      • 这几乎重复了最重要的答案,并且不包括 ceil(int) 函数,这是不可用的。另外,如果x 已经是int,那么这个检查还有什么意义呢?
      【解决方案8】:

      // C 语言.. 但算法是一样的

      #include <stdio.h>
      
      int main(){
        float x = 77.6;
      
        if(x-(int) x>0)
          printf("True! it is float.");
        else
          printf("False! not float.");        
      
        return 0;
      }
      

      【讨论】:

      • 也许您应该将其发布在明确针对 C 的问题中(例如 12 )?确保您的方法不会重复已发布的答案。
      【解决方案9】:
      /**
       * Check if the passed argument is an integer value.
       *
       * @param number double
       * @return true if the passed argument is an integer value.
       */
      boolean isInteger(double number) {
          return number % 1 == 0;// if the modulus(remainder of the division) of the argument(number) with 1 is 0 then return true otherwise false.
      }
      

      【讨论】:

        【解决方案10】:

        检查 ceil 函数和 floor 函数是否返回相同的值

        static boolean isInteger(int n) 
        { 
        return (int)(Math.ceil(n)) == (int)(Math.floor(n)); 
        } 
        

        【讨论】:

          【解决方案11】:
              double x == 2.15;
          
              if(Math.floor(x) == x){
                  System.out.println("an integer");
              } else{
                  System.out.println("not an integer");
              }
          

          我认为您可以类似地使用Math.ceil() 方法来验证x 是否为整数。这是因为Math.ceilMath.floorx 向上舍入到最接近的整数(比如y),如果x==y 那么我们原来的“x”是一个整数。

          【讨论】:

            【解决方案12】:

            您可以只使用x % 1 == 0,因为 x % 1 给出了 x / 1 的剩余值

            【讨论】:

            • 类似的答案已经存在,再次发布没有意义。
            【解决方案13】:

            所有给定的解决方案都很好,但是它们中的大多数可能会给静态代码分析(例如 SONAR)带来问题:“不应测试浮点数是否相等”(请参阅​​https://jira.sonarsource.com/browse/RSPEC-1244)。

            我假设应该测试的输入是双精度的,而不是字符串。

            作为一种解决方法,我测试了 not 是否为整数的数字:

            public boolean isNotInteger(double x) {
                return x - Math.floor(x) > 0;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-20
              • 2012-11-15
              • 1970-01-01
              相关资源
              最近更新 更多