如何在C#中向上舍入(而不是上限):n.5到(+)无限

时间:2017-10-17 02:41:57

标签: c# rounding

如有问题,如何使用C#n.5整数n整数:

1.5 -> 2
2.5 -> 3
-1.5 -> -1
-2.5 -> -2

1.4 -> 1
1.6 -> 2
-1.4 -> -1
-1.6 -> -2

我搜索但C#Math.Round仅支持MidpointRounding.AwayFromZeroMidpointRounding.ToEven。也许程序员应该欺骗来围绕正常生活中的数字(不是银行或学术思想......)?

预期结果与Javascript中一样,值n.5始终向上舍入到(+)无限 +∞

2 个答案:

答案 0 :(得分:1)

试试这个:)

[TestFixture]
public class TestClass
{
    int NumberOfDecimalDigits(double d)
    {
        var text = Math.Abs(d).ToString();
        int integerPlaces = text.IndexOf('.');
        int decimalPlaces = text.Length - integerPlaces - 1;
        return decimalPlaces;
    }

    double GetDelta(int numberOfDecimalDigits)
    {
        var deltaStringBuilder = new StringBuilder();
        deltaStringBuilder.Append("1");
        for (int i = 0; i < numberOfDecimalDigits; i++)
        {
            deltaStringBuilder.Append("0");
        }


        double delta = 1 / double.Parse(deltaStringBuilder.ToString());
        return delta;
    }

double Round(double value, int digits)
        {
            if (value > 0)
            {
                return Math.Round(value, digits, MidpointRounding.AwayFromZero);
            }
            if (value < 0)
            {
                var numberOfDecimalDigits = NumberOfDecimalDigits(value);
                double delta = GetDelta(numberOfDecimalDigits);
                return Math.Round(value + delta, digits, MidpointRounding.AwayFromZero);
            }

            return value;
        }

    double Round(double value)
    {
        if (value > 0)
        {
            return Math.Round(value, MidpointRounding.AwayFromZero);
        }
        if (value < 0)
        {
            var numberOfDecimalDigits = NumberOfDecimalDigits(value);
            double delta = GetDelta(numberOfDecimalDigits);
            return Math.Round(value + delta, MidpointRounding.AwayFromZero);
        }

        return value;
    }
    [Test]
    public void TestMethod()
    {
        Assert.AreEqual(Round(1), 1);
        Assert.AreEqual(Round(1.9), 2);
        Assert.AreEqual(Round(1.5), 2);
        Assert.AreEqual(Round(2.5), 3);

        Assert.AreEqual(Round(-1), -1);
        Assert.AreEqual(Round(-2.9), -3);

        Assert.AreEqual(Round(-1.5), -1);
        Assert.AreEqual(Round(-2.5), -2);
        Assert.AreEqual(Round(1.4), 1);
        Assert.AreEqual(Round(1.6), 2);

        Assert.AreEqual(Round(-1.4), -1);
        Assert.AreEqual(Round(-1.6), -2);
        Assert.AreEqual(Round(-1.55), -2);

        Assert.AreEqual(Round(-1.6666), -2);
        Assert.AreEqual(Round(-0.9999999), -1);
        Assert.AreEqual(Round(-0.001), 0);

        Assert.AreEqual(Round(2.35, 1), 2.4);
        Assert.AreEqual(Round(-2.35, 1), -2.3);

    }

答案 1 :(得分:1)

这是一个通过所有测试用例的版本。

static void Main(string[] args)
    {
        Round(double.Epsilon, 0);
        Round(0-double.Epsilon, 0);

        Round(1 + double.Epsilon, 1);
        Round(1 - double.Epsilon, 1);


        Round(1.5, 2);
        Round(2.5, 3);
        Round(-1.5, -1);
        Round(-2.5, -2);

        Round(1.4, 1);
        Round(1.6, 2);
        Round(-1.4, -1);
        Round(-1.6, -2);
    }

    private static void Round(double v1, int v2)
    {
        var equal = (MyRound(v1) == v2) ? "==" : "!=";
        Console.WriteLine($"Math.Round({v1}) {equal} {v2}, it's {MyRound(v1)}");
    }

    private static double MyRound(double v1)
    {
        return (v1 < 0)
            ? 0 - Math.Round(Math.Abs(v1)-0.1)
            : Math.Round(v1, MidpointRounding.AwayFromZero );
    }

输出:

Math.Round(4.94065645841247E-324) == 0, it's 0
Math.Round(-4.94065645841247E-324) == 0, it's 0
Math.Round(1) == 1, it's 1
Math.Round(1) == 1, it's 1
Math.Round(1.5) == 2, it's 2
Math.Round(2.5) == 3, it's 3
Math.Round(-1.5) == -1, it's -1
Math.Round(-2.5) == -2, it's -2
Math.Round(1.4) == 1, it's 1
Math.Round(1.6) == 2, it's 2
Math.Round(-1.4) == -1, it's -1
Math.Round(-1.6) == -2, it's -2