2014-11-01 79 views
0

我有一个双数字序列的公式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.

+2

使用一些数学和计算'地板((CA)/ d)',这将给你的近似于'n'。然后计算'a + d * n'。我会给你留下这些烦琐的容忍和f-p问题。 – 2014-11-01 16:05:16

+0

您可以将序列放入一个数组中,并使用[this this]之类的二进制搜索算法(http://www.java2s.com/Code/Java/Collections-Data-Structure/找到值最接近值htm的元素)来快速找到元素(索引)您正在寻找。我认为最小复杂度将保持“O(n)”。 – 2014-11-01 16:05:37

回答

3

假设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 *地板((21 - 3)/ 5)= 3 + 5 * 3 = 18

+0

可能希望通过检查'n-1'和'n + 1'除了'n'来解决舍入错误(如[评论]中所暗示的那样(http://stackoverflow.com/questions/26691053/rounding-的双对构件-的-AN-算术 - 级数最近#comment41978647_26691053)) – anatolyg 2014-11-04 16:38:35

相关问题