Сделать число кратным другому числу, но с плавающими числами?

#java #math

#java #математика

Вопрос:

У меня есть случайное число, которое должно соответствовать 360.0f. Моя проблема в том, что моя функция работает только для целых чисел. Как бы мне сделать так, чтобы другое число вписывалось в другое равномерно вверх или вниз (желательно ближе всего)

Как бы я заставил это работать с плавающими числами?

Вот что у меня есть:

 public static float fitNumberEvenlyIntoAnother(int number, int numberToFitInto)
{
    while(numberToFitInto % number != 0)
    {
        number  = 1;

        if(Math.abs(number / 2f) > Math.abs(numberToFitInto))
        {
            Log.w("fitNumberEvenlyIntoAnother", "Oh ow, the fitNumberEvenlyIntoAnother has surpassed the number it's suppose to fit into");
        }
    }

    //This number needs to fit into the number evenly. Cannot be null or nan.
    return number;
}
  

Комментарии:

1. Поскольку вы используете 360.0 , я предполагаю number , что это угол и его следует регулировать в диапазоне [0,360[ , например 410 degrees should be 50 degrees . Это правильно? Если нет, не могли бы вы привести примеры ввода и ожидаемого результата?

2. Это правильно, но я намерен использовать функцию более одного раза для разных диапазонов.

3. Конечно, все, что вам нужно, это оператор%? Если нет, то почему бы и нет?

Ответ №1:

Если вы хотите «настроить» число x в диапазон r (например, угол в [0,360[ ), то вы могли бы сделать следующее:

 double len = r.max - r.min; 
double frac = x/len - Math.floor(x/len);     
double result = frac < 0 ? r.min   len * (1   frac) :  r.min   len * frac;
  

Что вы делаете, это следующее:

  • вы получаете размер диапазона как len ( 360 - 0 = 360 в случае степеней)
  • вы вычисляете len/(x % len)
  • если дробь отрицательна, вы добавляете 1
  • результатом является нижняя граница диапазона плюс доля (в диапазоне [0,1] ) длины диапазона

Ответ №2:

Вместо того, чтобы зацикливаться на результате, просто проверьте, является ли результат деления целым числом:

 public static float fitNumberEvenlyIntoAnother(float number, float numberToFitInto) {
    float result = numberToFitInto / number;
    if (result == Math.round(result))
        return resu<
    return Float.NaN;
}
  

Вы не указали, что должно быть возвращено, если оно не соответствует равномерно — этот impl возвращает значение not a number — возможно, вы захотите сделать что-то другое.

Комментарии:

1. Он должен возвращать число, это число может уменьшаться или увеличиваться, пока оно не поместится в numberToFitInto .