У меня есть формула последовательности двойных чисел k = a + d * n
, где а и d являются постоянными двойными значениями, п представляет собой целое число, к> = 0, а> = 0. Например:Округление двойного до ближайшего члена арифметической прогрессии?
..., 300, 301.6, 303.2, 304.8, 306.4, ...
Я хочу округлить заданное число c
до ближайшего значения из этой последовательности, которое меньше c
.
В настоящее время я использую что-то вроде этого:
double someFunc(double c) {
static double a = 1;
static double d = 2;
int n = 0;
double a1 = a;
if (c >= a) {
while (a1 < c) {
a1 += d;
}
a1 -= d;
} else {
while (a1 > c) {
a1 -= d;
}
}
return a1;
}
Можно ли сделать то же самое без этих ужасных циклов? Я спрашиваю, потому что следующая ситуация может показаться:
abs(a - c) >> abs(d)
(первое число намного больше, чем второй, и поэтому много итераций возможно)
My question is similar to the following one. Но в моем случае, у меня тоже есть a
переменную, которая имеет влияние на конечный результат. Это означает, что последовательность может не иметь номера 0.
Используйте некоторые математики и вычислить 'пол ((са)/d)', который даст вам приближение к 'n'. Затем вычислите 'a + d * n'. Я оставлю вам вопросы о терпимости и f-p. –
Вы можете поместить последовательность в массив и использовать алгоритм бинарного поиска, например [этот] (http://www.java2s.com/Code/Java/Collections-Data-Structure/Findtheindexofthearraynearesttothevalue.htm), чтобы быстро найти элемент (индекс), который вы ищете. Я думаю, что минимальная сложность останется «O (n)». –