2016-06-08 52 views
0

使用時鐘系統很多小時計時最終看起來像這樣:如何使用C#四捨五入到最接近的.5#

0.266666666666。

現在,我想把所有的數字湊到「下一個.5的值」,使得0.2666666666變成0.5。

例子:

1.4 => Should become 1.5 
1.45 => Should become 1.5 
1.466666666 => Should become 1.5 
1.0 => Should remain 1.0 
1.6 => Should become 2.0 

的數字需要時刻進行四捨五入。

我將非常感謝任何有關如何在C#中實現此功能的幫助!

+0

因爲OP希望這不是一個重複的**達到最接近的0.5 **,**不就近0.5 **。 –

+0

@丹尼,謹慎地闡述其差異? –

+0

最近0.5到0.1是0,他想要0.5 – BugFinder

回答

0

我已經採取假設負值是一個有效輸入的自由和所希望的行爲總是從零開始;在負面投入的情況下,所有其他有效答案將趨於零。

實施是醜陋的,但有效且很容易理解:

public static double Round(double d) 
{ 
    var absoluteValue = Math.Abs(d); 
    var integralPart = (long)absoluteValue; 
    var decimalPart = absoluteValue - integralPart; 
    var sign = Math.Sign(d); 

    double roundedNumber; 

    if (decimalPart > 0.5) 
    { 
     roundedNumber = integralPart + 1; 
    } 
    else if (decimalPart == 0) 
    { 
     roundedNumber = absoluteValue; 
    } 
    else 
    { 
     roundedNumber = integralPart + 0.5; 
    } 

    return sign * roundedNumber; 
} 
+0

完美!負值確實是有效的輸入,因此這正是我正在尋找的。謝謝! – msk

3

我想你想是這樣的:

Math.Ceiling(value/0.5) * 0.5 
+0

儘管問題沒有具體說明,但可以合理地認爲,此解決方案在負值接近零時無法正常工作。 – InBetween

+1

這可能是我們想要的東西,我們不知道,沒有詳細說明;-) – keith

+0

不錯,簡單,運行良好,積極的價值觀,但它也必須與消極的價值觀,以及 - 我知道,我沒有'指定。感謝您的幫助,但:) – msk

1

試試這個:

var inputs = new [] { 1.4, 1.45, 1.466666666, 1.0, 1.6 }; 

foreach (var input in inputs) 
{ 
    Console.WriteLine("{0} => {1}", input, Math.Ceiling(2.0 * input)/2.0); 
} 

我得到:

 
1.4 => 1.5 
1.45 => 1.5 
1.466666666 => 1.5 
1 => 1 
1.6 => 2 
-2

這是你用來回合的分數值的功能

public static decimal GetRoundValue(decimal value) 
    { 
     decimal half = 0.5M; 
     int intValue = (int)value; 

     decimal decimalValue = value - intValue; 

     if (decimalValue > half) return intValue + half; 
     else return (decimal)intValue; 
    } 
+0

這隻會產生5個期望值之一。 – Enigmativity

-2

要在所期望的目標溶液通用通:

public static class Ext 
{ 
    public static decimal RoundUp(this decimal num, decimal step = 0.5m) 
    { 
     /* 
     * check the range of num and step 
      according to your requirement 
      e.g. num > 0 and step > 0 
     */ 

     var result = Math.Floor(num); 
     while (result < num) 
     { 
      result += step; 
     } 
     return result; 
    } 
} 

//用法

1.4m.RoundUp(); //1.5 
1.0m.RoundUp(); //1.0 
1.4m.RoundUp(0.2m); //1.4 
1.5m.RoundUp(0.2m); //1.6 
+0

OP給出了明確的輸入和輸出。你的答案應該顯示你的代碼如何滿足他的要求。 – Enigmativity