概述

在开发软件系统的时候,我们经常会跟金钱打交道,C#中使用decimal类型来表示金钱,decimal的基数是10(float和double都是2),因此它更适合用来存储金钱类型的数值。对于金钱,我们也经常会进行四舍五入操作(有的系统使用分整型可能不需要四舍五入的操作),那么在C#中如何对decimal类型进行四舍五入呢?

Math.Round的使用

我们可以使用Math.Round函数来对decimal类型的数值进行“四舍五入”处理。来看下面的代码:

decimal levyMoney1 = 77.24m; decimal levyMoney2 = 24.56m; //设置保留一位小数并输出 ("money1对应的输出:" Math.Round(levyMoney1, 1)).Dump(); ("money2对应的输出:" Math.Round(levyMoney2, 1)).Dump();

输出结果如下:

如何将数字金额四舍五入(中如何对金额数值进行四舍五入)(1)

结果跟我们期望的一致!但是事实真的是这样吗?让我们下面再看个示例。

decimal levyMoney3 = 50.35m; decimal levyMoney4 = 50.45m; //C#的Round函数都是采用Banker’s rounding(银行家算法),即:四舍六入五取偶 ("money3对应的输出:" Math.Round(levyMoney3, 1)).Dump(); ("money4对应的输出:" Math.Round(levyMoney4, 1)).Dump();

输出结果如下:

如何将数字金额四舍五入(中如何对金额数值进行四舍五入)(2)

纳尼?输出的竟然都是50.4?和我们理解的“四舍五入”不一致啊!这是因为C#的Round函数都是采用Banker’s rounding(银行家算法),即:四舍六入五取偶。所以结果才都是50.4。

正确表达四舍五入

那么,如何才能正确地表达四舍五入呢?Round的方法有个重载,其中第三个参数(MidpointRounding)用来表示舍入的规范。因此,四舍五入可以通过设置该参数为MidpointRounding.AwayFromZero来达到目的,如下:

decimal levyMoney3 = 50.35m; decimal levyMoney4 = 50.45m; ("money3四舍五入对应的输出:" Math.Round(levyMoney3, 1, MidpointRounding.AwayFromZero)).Dump(); ("money4四舍五入对应的输出:" Math.Round(levyMoney4, 1, MidpointRounding.AwayFromZero)).Dump();

输出结果如下:

如何将数字金额四舍五入(中如何对金额数值进行四舍五入)(3)

,