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