Java - 如何检查除法的结果是整数还是浮点数?

12

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

例如,我得到了i = 33。然后i将被转换为32(16x2)。但如果我得到i = 50,那么它将被转换为48(16x3)。

我尝试了很多方法,例如:

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

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


4
两个整数相除的结果总是一个整数。你可以使用取模运算符(%)代替。 - GriffeyDog
建议尝试另一种解决此问题的方法。这种循环查找一个可从 i 减去以得到 16 的倍数的数字的方法非常低效。如果最接近 16 的倍数大于 i,该怎么办? - Alex
7个回答

18

使用模运算符(mod operator)。模运算可以给出除法操作的余数。

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

5
当余数为0时,(i - x)/16是整数。可以使用%(modulus)运算符进行计算,例如: (i-x)%16==0
if((i - x)%16 == 0) {
   // (i-x)/16 is integer
}

5

由于所有可被16整除的整数的最后四位都是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

4

你原始代码存在一些问题:

  1. 如果你要对最接近的16的倍数进行舍入,那么你需要减去的最大值为15。因此,循环的上限应该最多为15。
  2. 正如其他人所指出的,你可以使用模运算符(%)来确定从给定值中减去的确切值,以将其舍入为最接近的16的倍数。这完全消除了循环的需要。
  3. 但由于16是2的幂,并且整数表示为具有32位数字(即32位)的二进制数,因此你可以通过使用位掩码直接计算该值,以便将数字中小于16的任何数字置零。在Java中,你可以使用二进制&运算符来实现这个目的,例如:i&0xfffffff0。这将清零最后4位数字(表示:8-4-2-1),有效地将数字舍入为最接近16的倍数的值。
  4. 如果你需要执行整数除法并忽略任何余数,可以通过向右移动4位(>>)来执行该操作。

1
要判断一个数字是否可以被另一个数整除,可以查看其他答案,取模(%)就是这样做的方法。
要执行上述操作,您不需要使用循环:
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
确实,他的例子(和代码)似乎表明,他想要最接近且小于等于... - xbakesx
@Alex,现在你真的有最近的:) - xbakesx

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()而不是round或floor,因为整数除法几乎等于floor,小数部分将被舍去并显示为“整数除法”。


0
如果您需要最接近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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接