【问题标题】:Java - How to check if a division is an integer or a float?Java - 如何检查除法是整数还是浮点数?
【发布时间】:2012-08-19 08:22:55
【问题描述】:

想不出更好的标题。 那么问题是: 我有“int i”,它可以是任何值。我的目标是将“int i”转换为可被 16 整除的最接近的数字。

例如,我得到了 i = 33。然后我将变成 32 (16x2)。但是如果我得到 i = 50,那么它将变成 48 (16x3) .

我尝试了很多东西,例如:

for (int x = i; x < 999; x++){
if ( (i - x)/16 *is an integer*){
i = i - x;
}

但我不知道如何检查它是否为整数。所以也许我以前的代码可以工作,但我只需要找到一种方法来检查它是整数还是浮点数。所以..任何帮助表示赞赏。

【问题讨论】:

  • 两个整数的除法总是有一个整数结果。您可以改用模数 (%)。
  • FWIW,我建议尝试不同的方法来解决这个问题。这种循环查找可以从 i 中减去的数字以获得 16 的倍数的方法非常低效。如果 16 的最接近的倍数大于 i 怎么办?

标签: java math int division operation


【解决方案1】:

为了检查随机除法是否导致整数或分数,您需要以下内容:

int n = 9;
int p = 3;

if (n % p == 0) {
    //the division results in an integer.
}
else
{
    //the division results in a fraction.
}

您也可以这样做:

if (n / p == Math.ceil((double) n / (double) p)) {
    //the division results in an integer.
}
else
{
    //the division results in a fraction.
}

需要 Math.ceil() 而不是取整或取整,因为整数除法几乎等于取整,而分数将向下取整并显示为“整数除法”。

【讨论】:

    【解决方案2】:

    由于所有可被 16 整除的整数都将其最后 4 位设置为 0。您可以在没有循环甚至 if 语句的情况下完成您想要的:

    i &= 0xfffffff0; // Sets i to the greatest multiple of 16 less than i, or 0 for i < 16
    

    例如:

    int i = 50;
    i &= 0xfffffff0; // i == 48
    
    i = 39;
    i &= 0xfffffff0; // i == 32
    
    i = 16;
    i &= 0xfffffff0; // i == 16
    

    【讨论】:

      【解决方案3】:

      如果您需要 16 的 最近倍数,那么您有两种情况可以处理 8 的奇数倍数。 1. 8 变成 16,24 变成 32 2. 8变成0,24变成16

      对于第一个:

      int j = ((i+8)/16)*16;
      

      第二种情况:

      int j = ((i+7)/16)*16;
      

      如果你想一直向下取整(即 17 变为 16,15 变为 0):

      int j = (i/16)*16;
      

      如果你想总是向上取整(不是你的例子所说的),你会这样做:

      int j = ((i+15)/16)*16;
      

      【讨论】:

        【解决方案4】:

        要确定一个数字是否能整除另一个数字,请查看其他答案,模 (%) 是这样做的方法。

        要做上面你想做的事,你不需要循环:

        public int nearestDivider(final int input)
        {
            final int multiple = input / 16; // this will divide by 16 and it's integer math, so it loses the decimal
            return multiple * 16;
        }
        

        如果你像你的例子那样给它 50,那将返回 48。

        如果你真的想要最近的,那么你将不得不做一些浮点除法

        public int nearestDivider(final int input)
        {
            final int multiple = Math.round((float) input / 16);
            return multiple * 16;
        }
        

        现在 46 返回 48,149 返回 144 等等。

        【讨论】:

        • 根据“最接近”的定义,您可能需要添加 16。
        • 没错,他的示例(和代码)似乎表明,他希望最接近小于或等于...
        • @Alex 现在你真的有最近的:)
        【解决方案5】:

        您的原始代码存在许多引人注目的问题:

        1. 如果要向下舍入到最接近的 16 倍数,则可能需要减去的最大值是 15。因此,循环的上边界最多应为 15。
        2. 正如其他人所指出的,您可以使用模运算符 (%) 来确定要从给定值中减去的确切值,以将其向下舍入到最接近的 16 倍数。这样就完全不需要循环了。
        3. 但是由于 16 是 2 的幂,并且由于整数表示为具有 32 位数字(即 32 位)的二进制数,因此您可以更直接地计算该值,方法是使用位掩码将小于 16 的数字归零数字。在 Java 中,您可以像这样使用二进制 & 运算符:i &amp; 0xfffffff0。这会将最后 4 位数字清零(代表:8-4-2-1),这实际上会将您的数字向下舍入到可被 16 整除的最接近的值。
        4. 如果您需要对数字执行整数除法并忽略任何余数,您只需将 (&gt;&gt;) 移动 4 位即可。

        【讨论】:

          【解决方案6】:

          (i - x)/16 的余数为 0 时,(i - x)/16 为整数。使用 %(modulus) 运算符,如:

          if((i - x)%16 == 0) {
             // (i-x)/16 is integer
          }
          

          【讨论】:

            【解决方案7】:

            使用 mod 运算符。 Mod 为您提供除法运算的余数。

            public boolean isEvenlyDivisable(int a, int b) {
                return a % b == 0;
            }
            

            【讨论】:

              猜你喜欢
              • 2011-04-22
              • 2020-05-05
              • 1970-01-01
              • 1970-01-01
              • 2022-01-10
              • 1970-01-01
              相关资源
              最近更新 更多