日期:2014-05-17  浏览次数:20906 次

Math.Round 四舍六入五成双 C#

环境VS2005,VS2003没有测试。

Math.Round (Decimal, Int32) 将小数值舍入到指定精度。
由 .NET Compact Framework 支持。
Math.Round (Double, Int32)?
将双精度浮点值舍入到指定精度。
由 .NET Compact Framework 支持。

msdn并没有详细的说明清楚,给了一个例子;
Math.Round(3.44, 1); //Returns 3.4.
Math.Round(3.45, 1); //Returns 3.4.
Math.Round(3.46, 1); //Returns 3.5.

依照他的例子得到的是"五舍六入",我改变了一下数字得到的结果将完全改变。

Math.Round(3.445, 1); //Returns 3.4.
Math.Round(3.455, 1); //Returns 3.5.
Math.Round(3.465, 1); //Returns 3.5.

Math.Round(3.450, 1); //Returns 3.4.(补0是无效的)

Math.Round(3.4452, 2); //Returns 3.45.
Math.Round(3.4552, 2); //Returns 3.46.
Math.Round(3.4652, 2); //Returns 3.47.

四舍六入五成双 

四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则。 

对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,

?

也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,

"六"是指≥6时进上,

"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;

当5后无数或为0时,需要分两种情况来讲:

①5前为奇数,舍5入1;

②5前为偶数,舍5不进。  

?

具体规则如下:  

? ?1. 被修约的数字等于或小于4时,该数字舍去; 

 2. 被修约的数字等于或大于6时,则进位; 

 3. 被修约的数字等于5时,要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。 

 

举例,用上述规则对下列数据保留3位有效数字: 

 9.8249=9.82, 9.82671=9.83 

 9.8350=9.84, 9.8351 =9.84  

? ?9.8250=9.82, 9.82501=9.83  

从统计学的角度,“四舍六入五成双”比“四舍五入”要科学,在大量运算时,它使舍入后的结果误差的均值趋于零,而不是像四舍五入那样逢五就入,导致结果偏向大数,使得误差产生积累进而产生系统误差,“四舍六入五成双”使测量结果受到舍入误差的影响降到最低。  

?

例如:1.15+1.25+1.35+1.45=5.2,

若按四舍五入取一位小数计算:  

1.2+1.3+1.4+1.5=5.4  

按“四舍六入五成双”计算,

1.2+1.2+1.4+1.4=5.2,舍入后的结果更能反映实际结果。

?