Excel Round函数的等效函数是什么?

4
我有一个数字,如下:3206.6186522022 我使用了 Excel 公式:
ROUND(3206.6186522022;-2)

这段话的意思是:“这个给了我:3200。那么我该如何在C#中实现相同的功能呢?”
2个回答

4

这是一个演示如何实现的样例LINQPad程序。我通过在Excel中运行所有这些数字来验证它的行为方式:

void Main()
{
    Verify(ROUND(3206.618652, 2), 3206.62).Dump();
    Verify(ROUND(3206.618652, 1), 3206.6).Dump();
    Verify(ROUND(3206.618652, 0), 3207).Dump();
    Verify(ROUND(3206.618652, -1), 3210).Dump();
    Verify(ROUND(3206.618652, -2), 3200).Dump();

    Verify(ROUND(3207.618652, 2), 3207.62).Dump();
    Verify(ROUND(3207.618652, 1), 3207.6).Dump();
    Verify(ROUND(3207.618652, 0), 3208).Dump();
    Verify(ROUND(3207.618652, -1), 3210).Dump();
    Verify(ROUND(3207.618652, -2), 3200).Dump();

    Verify(ROUND(3205.618652, 2), 3205.62).Dump();
    Verify(ROUND(3205.618652, 1), 3205.6).Dump();
    Verify(ROUND(3205.618652, 0), 3206).Dump();
    Verify(ROUND(3205.618652, -1), 3210).Dump();
    Verify(ROUND(3205.618652, -2), 3200).Dump();

    Verify(ROUND(-3206.618652, 2), -3206.62).Dump();
    Verify(ROUND(-3206.618652, 1), -3206.6).Dump();
    Verify(ROUND(-3206.618652, 0), -3207).Dump();
    Verify(ROUND(-3206.618652, -1), -3210).Dump();
    Verify(ROUND(-3206.618652, -2), -3200).Dump();

    Verify(ROUND(-3207.618652, 2), -3206.62).Dump();
    Verify(ROUND(-3207.618652, 1), -3206.6).Dump();
    Verify(ROUND(-3207.618652, 0), -3207).Dump();
    Verify(ROUND(-3207.618652, -1), -3210).Dump();
    Verify(ROUND(-3207.618652, -2), -3200).Dump();

    Verify(ROUND(-3205.618652, 2), -3205.62).Dump();
    Verify(ROUND(-3205.618652, 1), -3205.6).Dump();
    Verify(ROUND(-3205.618652, 0), -3206).Dump();
    Verify(ROUND(-3205.618652, -1), -3210).Dump();
    Verify(ROUND(-3205.618652, -2), -3200).Dump();

    Verify(ROUND(3205.4, 0), 3204).Dump();
    Verify(ROUND(3205.6, 0), 3205).Dump();

    Verify(ROUND(-4.4, 0), -4).Dump();
    Verify(ROUND(-4.5, 0), -5).Dump();
    Verify(ROUND(-4.6, 0), -5).Dump();
    Verify(ROUND(4.4, 0), 4).Dump();
    Verify(ROUND(4.5, 0), 5).Dump();
    Verify(ROUND(4.6, 0), 5).Dump();
}

public static string Verify(double value, double expected)
{
    if (Math.Abs(value - expected) < 1e-8)
        return string.Empty;

    return value + " is not equal (enough) to " + expected;
}

public static double ROUND(double value, int decimals)
{
    if (decimals < 0)
    {
        var factor = Math.Pow(10, -decimals);
        return ROUND(value / factor, 0) * factor;
    }
    return Math.Round(value, decimals, MidpointRounding.AwayFromZero);
}

@MatthewWatson 是的,你说得对。我已经编辑了答案,包括 MidpointRounding.AwayFromZero - Vishal Suthar

1

供参考,此代码也有效(已根据相同的测试数据进行验证):

public static double Round(double value, int digits)
{
    double pow = Math.Pow(10, digits);
    return Math.Truncate(value * pow + Math.Sign(value)*0.5) / pow;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接