十进制的奇怪行为

时间:2018-09-11 13:58:48

标签: c# .net-core coreclr

使用decimal时,为什么舍入行为总是相同的?

无论我是否使用MidpointRounding.AwayFromZero,它总是给出1.04。在第一种情况下,输出不应该是1.03吗?

Console.WriteLine(decimal.Round(1.035m, 2));
Console.WriteLine(decimal.Round(1.035m, 2, MidpointRounding.AwayFromZero));

https://github.com/dotnet/corefx/blob/664d98b3dc83a56e1e6454591c585cc6a8e19b78/src/Common/src/CoreLib/System/Decimal.cs#L612

https://github.com/dotnet/corefx/blob/61d792e202d039c304c4f04ad816a57688f32fd4/src/Common/src/CoreLib/System/Decimal.DecCalc.cs#L2429-L2444

5 个答案:

答案 0 :(得分:1)

No:

  

此方法[Round(decimal d, int decimals)等效于使用模式参数Round(Decimal, Int32, MidpointRounding)调用MidpointRounding.ToEven方法。

     

当d恰好位于两个四舍五入值之间的一半时,结果是四舍五入后的值,该值在最右端的小数位具有偶数位。例如,当四舍五入到两位小数时,值2.345变为2.34,值2.355变为2.36。

因此,将1.035舍入为偶数时,由于4是偶数而3不是,所以它变成1.04

答案 1 :(得分:1)

默认的舍入方法为MidpointRounding.ToEven,因此在选择是舍入为1.03还是1.04时,它会选择一个以偶数结尾的数字{{1} }。

答案 2 :(得分:0)

MSDN说:

public static decimal Round(
    decimal d,
    int decimals
)
  

decimals:小数位数:0到28之间的一个值,用于指定   四舍五入。

您想在2个位置取整,它必须为1.04

答案 3 :(得分:0)

对我来说,这是四舍五入时的预期行为。

例如:

1.035 => 1.040产生两位小数1.04

1.033 => 1.030产生两位小数1.03

答案 4 :(得分:0)

默认舍入不是四舍五入吗?在这种情况下,5会被四舍五入并结转...

默认情况下,Round方法使用四舍五入到最接近的约定。下表列出了Round方法的重载以及各自使用的舍入约定。 https://docs.microsoft.com/en-us/dotnet/api/system.math.round?view=netframework-4.7.2