我有一个双数字序列的公式k = a + d * n
,其中a和d是常数double值,n是整数,k> = 0,a> = 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.
使用一些数学和计算'地板((CA)/ d)',这将给你的近似于'n'。然后计算'a + d * n'。我会给你留下这些烦琐的容忍和f-p问题。 – 2014-11-01 16:05:16
您可以将序列放入一个数组中,并使用[this this]之类的二进制搜索算法(http://www.java2s.com/Code/Java/Collections-Data-Structure/找到值最接近值htm的元素)来快速找到元素(索引)您正在寻找。我认为最小复杂度将保持“O(n)”。 – 2014-11-01 16:05:37