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

时间:2012-08-23 18:40:36

标签: java math int division operation

想不出更好的头衔。 那么问题是: 我有“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;
}

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

7 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:5)

(i - x)/16的余数为0时,

(i - x)/16为整数。使用%(模数)运算符,如:

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

答案 2 :(得分:5)

由于所有可被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 :(得分:4)

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

  1. 如果你向下舍入到最接近的16的倍数,那么你可能需要减去的最高值是15.因此你的循环的上边界最多应该是15。
  2. 正如其他人已经注意到的那样,您可以使用模运算符(%)来确定从给定值减去的精确值,以将其向下舍入到最接近的16的倍数。这样就完全不需要循环
  3. 但由于16是2的幂,并且由于整数表示为32位(即32位)的二进制数,因此可以通过使用位掩码将任何小于16的数字归零来更直接地计算该值。数。在Java中,您可以使用二进制&amp;为此目的的运算符,如下所示:i & 0xfffffff0。这将使最后4位数字(代表:8-4-2-1)数字归零,这有效地将您的数字向下舍入到可被16整除的最近值。
  4. 如果你需要执行数字的整数除法并忽略任何余数,你可以简单地将(>>)移位4位来代替。

答案 4 :(得分:1)

要确定一个数字是否均匀地划分另一个,请查看其他答案,Modulo(%)就是这样做的方法。

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

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等。

答案 5 :(得分: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;

如果你想要总是想要倒DOWN(即17变为16,而15变为0):

int j = (i/16)*16;

如果你想要总是向上舍入(不是你的例子所说的那样),你可能会这样做:

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

答案 6 :(得分:0)

为了检查随机分割是否产生整数或分数,您需要以下内容:

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并且fraction会向下舍入并显示为&#39;整数除法&#39;。

相关问题