Java-как проверить, является ли деление целым числом или поплавком?

не мог придумать лучшего названия. Ну проблема: У меня есть "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 ответов


Так как все Инты, которые делятся на 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

Используйте оператор mod. Мод дает остаток от деления.

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

(i - x)/16 является целым числом, когда остаток (i - x)/16 равен 0. Используйте оператор %(modulus), например :

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

существует ряд поразительных проблем с вашим исходным кодом:

  1. если вы округляете до ближайшего кратного 16, из этого следует, что наибольшее значение, которое вам, возможно, придется вычесть, - 15. Поэтому верхняя граница вашего цикла должна быть не более 15.
  2. как отмечали другие, вы можете использовать оператор по модулю (%), чтобы определить точное значение вычесть из заданного значения округлить до ближайшего кратного 16. Это удаляет необходимость в петле полностью.
  3. но поскольку 16-это степень 2, и поскольку целые числа представлены в виде двоичного числа с 32 цифрами (т. е. 32 бит), вы можете вычислить значение более непосредственно, используя битовую маску, чтобы обнулить любые цифры меньше 16 в числе. В Java вы можете использовать оператор binary & для этой цели следующим образом:i & 0xfffffff0. Это обнулит последние 4 цифры (те, которые представляют: 8-4-2-1), что эффективно округляет ваш номер до ближайшего значения, делимого на 16.
  4. Если вам нужно выполнить целочисленное деление числа и игнорировать любой остаток, вы можете просто сдвинуть (>>) на 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;
}

это вернет 48, Если вы дадите ему 50, как ваш пример.

Если вы действительно хотите ближайший тогда вам придется сделать некоторое деление с плавающей запятой

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

теперь 46 возвращает 48, 149 возвращает 144 и т. д.


Если вам нужны ближайший кратно 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;

чтобы проверить, приводит ли случайное деление к целому числу или дроби, вам нужно следующее:

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.
}

нужна математика.ceil (), а не круглый или пол, потому что целочисленное деление почти равно полу, а дробь будет округлена вниз и появится как "целочисленное деление".