Math.Round为十进制

时间:2010-09-06 08:43:25

标签: c# rounding

我正在运行此代码:

decimal d = 1.45M;

Console.WriteLine((System.Math.Round(d,0,MidpointRounding.AwayFromZero).ToString()));

这里我希望输出为2,因为舍入到第1个小数位时的1.45将是1.5,当下一个舍入到0小数位时应该是2.

然而,我得到答案为1。

我的假设是否正确?如果是这样,这是Math.Round的错误吗?

3 个答案:

答案 0 :(得分:8)

不,这不是错误。你的逻辑谈论四舍五入 - 但你只有一次调用Round。 1.45小于1和2(1.5)之间的中点,因此它向下舍入为1.

如果您希望代码遵循您的逻辑,您可以这样做:

using System;

class Test
{
    static void Main()
    {
        decimal d = 1.45m;
        d = Math.Round(d, 1, MidpointRounding.AwayFromZero); // 1.5
        d = Math.Round(d, 0, MidpointRounding.AwayFromZero); // 2

        Console.WriteLine(d);
    }
}

除非您指定,否则您希望进行两个舍入阶段(如上所述).NET将只执行该过程。

答案 1 :(得分:0)

你不能一位一位地做'圆'动作!在这里你说:

1.45 rounded to 1 decimal place:1.5
1.5 rounded to 0 decimal place:2

这不正确,这里1.45四舍五入为0位,你只需要检查.4。

答案 2 :(得分:0)

您的理解不正确。

您指定的小数值为0,因此提供的值将四舍五入为整数值。

从MSDN“如果小数位参数表示的小数位右边的d中第一个数字的值是5,小数位的数字如果是奇数则向上舍入,如果是偶数则单独留下“

由于小数点右边的第一个值是4而不是5,因此返回的值为1.

如果十进制值为1.55,则答案为2。

如果小数值是2.55,那么答案也是2!

当您指定中点舍入行为时,这将被更改,但是当您要求该轮使用decimals = 0时,它将仅检查小数点后的第一个数字。

事实上,如果您在

中指定了小数= 1
Math.Round(1.45,1)

然后你的答案是1.4,因为它会检查小数点后面的第二个数字,以便对第一个数字进行舍入。