我正在运行此代码:
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的错误吗?
答案 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时,它将仅检查小数点后的第一个数字。
事实上,如果您在
中指定了小数= 1Math.Round(1.45,1)
然后你的答案是1.4,因为它会检查小数点后面的第二个数字,以便对第一个数字进行舍入。