关于四舍五入的小区别 博客分类: C# Decimalround
程序员文章站
2024-03-16 12:28:28
...
常用小数舍入标准简介
1、标准四舍五入(Math.Round();)
当舍去位的数值大于等于5时,在舍去该位的同时向前位进一;当舍去位的数值小于5时,则直接舍去该位。
2、银行家舍入(decimal.Round())
所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。其规则是:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于等于6时,在舍去该位的同时向前位进一;当舍去位的数值等于5时,如果前位数值为奇,则在舍去该位的同时向前位进一,如果前位数值为偶,则直接舍去该位。
下面举.NET中处理decimal类型的一个例子:
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { //Floor方法向负无穷方向舍入为最接近的整数 Console.WriteLine(decimal.Floor(-1.3m)); //-2 Console.WriteLine(decimal.Floor(3.5m)); //3 Console.WriteLine(decimal.Floor(4m)); //4 //Truncate方法向零方向舍入为整数 Console.WriteLine(decimal.Truncate(-1.3m));//-1 Console.WriteLine(decimal.Truncate(3.5m));//3 Console.WriteLine(decimal.Truncate(4m)); //4 //实现正的decimal数值的四舍五入,则必须用下面的技巧,保留到小数点后2位,就用100,保留到小数点后3位就用1000,依次类推 decimal a = 8.335m, b = 8.345m; Console.WriteLine(decimal.Truncate(a * 100 + 0.5m) / 100); //8.34 Console.WriteLine(decimal.Truncate(b * 100 + 0.5m) / 100); //8.35 //实现负的decimal数值的四舍五入,则必须用下面的技巧,保留到小数点后2位,就用100,保留到小数点后3位就用1000,依次类推 decimal c = -8.335m, d = -8.345m; Console.WriteLine(decimal.Truncate(c * 100 - 0.5m) / 100); //8.34 Console.WriteLine(decimal.Truncate(d * 100 - 0.5m) / 100); //8.35 Console.WriteLine(); } } }
注意:小数默认的类型是double类型,所以凡是末尾没加m或M的小数都是double类型。
System.Decimal的Round方法和System.Math结构的Round方法默认情况下,都是采用的银行家舍入,即四舍六入五取偶,其中带一个参数的重载和带两个参数的重载形式下,默认都是银行家舍入。比较特殊的是带三个参数的Round方法,它的第三个参数是MidpointRounding枚举类型,MidpointRounding枚举类型定义了两个枚举值,为了实现四舍五入,我们这里使用的是MidpointRounding.AwayFromZero这个值。MidpointRounding.AwayFromZero枚举值的真正意思是:当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较大的值。
所以我们既可以使用Round方法的前两种重载形式实现银行家舍入,也可以使用带三个参数的Round方法实现四舍五入,但枚举值必须使用MidpointRounding.AwayFromZero,而不能使用MidpointRounding.ToEven。