2014-11-01 66 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

相關問題