2017-02-10 39 views
1

我正在研究一個統計數據應用程序,並且遇到舍入問題。 我想顯示一個圖表,它有多個點都連接到線。 爲了能夠自動調整比例,我想執行某種計算。我已經想出了要做什麼,但是我無法正確地將它翻譯成代碼。將數字舍入到最接近的5或10的倍數,取決於最先的數字

所以,這就是我想要做的: 我通過我的值列表來查找最大的值。 在我的圖形中,我有6條參考線。所以我把我的價值除以一位數以下的頭寸,以確保我得到的價值(乘以實際的頭寸數量)將大於我的最大金額,這樣我的行不會不要超出我的圖形。

一旦我有這個值,我需要在相同的範圍內得到5或10的最接近的整數(取決於先來)。

所以給你一些例子:

example 1: 
initial value = 685425 
divided value = 685425/5 = 137085 => rounded value = 150000 

example 2: 
initial value = 53 
divided value = 53/5 = 10.6 => rounded value = 15 

example 3: 
initial value = 8215 
divided value = 8215/5 = 1643 => rounded value = 2000 

所以我總是舍入到的5或10最接近的整數倍,但在相同的範圍內。

我該如何把這個代碼?

謝謝 肯尼斯

回答

1
public static int GetLimit(int v) 
{ 
    int by5 = v/5; 

    // for too small numbers we return early 
    if (by5 < 0) return 0; 
    if (by5 < 5) return 5; 
    if (by5 < 10) return 10; 

    int log = (int)Math.Log10(by5) - 1; 
    int scope = (int)Math.Pow(10, log); 
    int tmp = by5/scope; 
    tmp = 5 * ((tmp/5) + 1); 
    return tmp * scope; 
} 

它使用十進制數,以獲得 「範圍」(scope)。然後它將該範圍除以該範圍以獲得前兩位數字,將它們「舍入」到5的下一個倍數(5*((tmp/5) + 1))並再次乘以範圍以回到範圍。

對於太小的數字(小於50),它會提前返回,因爲scope將變爲0,這將導致DivideByZeroException

Console.WriteLine(GetLimit(685425)); 
Console.WriteLine(GetLimit(53)); 
Console.WriteLine(GetLimit(8215)); 
Console.WriteLine(GetLimit(11)); 
Console.WriteLine(GetLimit(2)); 

導致

150000 
15 
2000 
5 
5 

替代使用Math.LogMath.Pow將分割數轉換爲字符串工作與最早出現的兩個數字和的長度。我沒有測試這是否會更快,但我不這麼認爲。如果這對性能至關重要,則需要對其進行測試。

相關問題