我有一个 double 序列的公式 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。
最佳答案
假设 c 是您序列中的一个数字。然后你有 n = (c - a)/d
。
因为你想要一个整数 <= c,所以取 n = floor((c - a)/d)
。
然后你可以将 c 舍入为:a + d * floor((c - a)/d)
假设 k = 3 + 5 * n
并且您舍入 c=21。
并且 3 + 5 * floor((21 - 3)/5) = 3 + 5 * 3 = 18
关于algorithm - 将双舍入到算术级数的最近成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26691053/