为什么.net数学.四舍五入方法在处理负数时向下舍入5而不是向上舍入

本文关键字:舍入 四舍五入 数学 net 方法 处理 为什么 | 更新日期: 2023-09-27 18:13:40

我注意到,当我调用Math。将其四舍五入并提供十进制值-0.375,并尝试将其四舍五入到小数点后两位,它将值四舍五入到-0.38。我一直被教导5或更大意味着四舍五入这意味着它应该是-0.37。四舍五入到-0.37是Javascript如何做到这一点,这就是我如何发现这个问题的开始。

下面是一些示例代码。

    decimal negNumber = -0.375m;
    var resultToEven = Math.Round(negNumber, 2, MidpointRounding.ToEven);
    var resultAwayFromZero = Math.Round(negNumber, 2, MidpointRounding.AwayFromZero);
    Console.WriteLine("Original Number: " + negNumber);
    Console.WriteLine("ToEven: " + resultToEven);
    Console.WriteLine("Away from zero: " + resultAwayFromZero);

输出如下:

原编号:-0.375
低:-0.38
距离0:-0.38

我使用的是。net 4.0。

为什么.net数学.四舍五入方法在处理负数时向下舍入5而不是向上舍入

Math中的默认行为。Round是使用midpointrouning。ToEven,将"向最近的偶数舍入"。

MSDN描述了为什么选择这个:

如果数字位置上的数字是奇数,则将其变为偶数。否则,保持不变。此行为遵循IEEE标准754第4节。它有时被称为四舍五入或银行四舍五入。它可以最大限度地减少由于在单个方向上始终舍入中点值而导致的舍入误差。

第二个调用使用AwayFromZero,它显式舍入:

指向离0最近的数

在你的例子中,-0.38比-0.37离0.0"更远"。

我想你的答案在选项"远离零"的措辞中。-0.38比-0.37离零更远。"远离"我猜是指abs(-0.38) > abs(-0.37)

http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx