如何使用C#

时间:2016-06-08 08:46:37

标签: c# function math

使用时间计时系统时钟的大部分时间最终看起来像这样:

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#中实现这一目标的任何帮助!

5 个答案:

答案 0 :(得分:3)

我想你想要这样的东西:

Math.Ceiling(value / 0.5) * 0.5

答案 1 :(得分: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 :(得分:1)

我冒昧地假设负值是一个有效的输入,并且所希望的行为总是从零开始;如果是负输入,所有其他有效答案将舍入为零。

实施难度大,但有效且易于理解:

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;
}

答案 3 :(得分:-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;
    }

答案 4 :(得分:-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