2016-06-08 150 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