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

开发者为了实现小数点后 2 位的四舍五入,编写了如下代码,

var num = Math.Round(12.125, 2);

代码非常的简单,开发者实际得到的结果是12.12, 这与其所预期的四舍五入结果12.13相悖。

其实产生这个结果的原因是由于Math.Round 默认使用的并非是四舍五入的原则,而是四舍六入五成双的原则。

四舍六入五成双

所谓的四舍六入五成双,就是说当确定有效位数之后,有效位数的下一位如果小于等于4就舍去,如果大于等于6就进一,当有效位数的下一位是5的时候

如果5前为奇数,就舍五进一

如果5前为偶数,就舍五不进(0是偶数)

从统计学上将,四舍六入五成双比四舍五入要更精确,因为大量计算的情况下,四舍五入逢五进一,会导致结果偏向大数。

例如:

csharp 复制代码
1.15+1.25+1.35+1.45 = 5.2

如果有效位数是小数点后一位,使用四舍五入原则得到的结果

csharp 复制代码
1.2 + 1.3 + 1.4 + 1.5 = 5.4

而使用四舍六入五成双原则得到的结果是

csharp 复制代码
1.2 + 1.2 + 1.4 + 1.4 = 5.2

由此可见四舍六入五成双原则得到的结果更为精确。

Math.Round的四舍五入

那么如何使用Math.Round实现预期的四舍五入呢?

其实C#中的Math.Round提供了非常多的重载方法,其中有两个重载方法是,

csharp 复制代码
public static double Round (double value, int digits, MidpointRounding mode);
public static decimal Round (decimal d, int decimals, MidpointRounding mode);

这两个方法都提供了第三个参数mode, mode是一个MidpointRounding的枚举变量,它有2个可选值

AwayFromZero - 四舍五入

ToEven - 四舍六入五成双

所以如果我们希望的到一个理想中四舍五入的结果,,我们可以改用如下代码:

csharp 复制代码
var num = Math.Round(12.125, 2, MidpointRounding.AwayFromZero);
相关推荐
上海安当技术3 小时前
C/S 桌面软件怎么接 UKey 强认证?C# SDK 与 C 动态库集成 WinForms/Qt/工控实战
c语言·qt·c#
明如正午4 小时前
【C#】跨线程更新进度条_UpdateProgress 方法解析
c#
曹牧6 小时前
C#:`JsonConvert.DeserializeObject`
windows·c#
冷咖啡离 我的笨笨6 小时前
数据去重:通过 C# 删除 Excel 中的重复行
开发语言·c#·excel
鱼听禅9 小时前
C#学习笔记-添加编译参数到程序集自动更新程序编译时间
笔记·学习·c#
不正经学生10 小时前
C语言指针进阶:const 和野指针——给指针加锁,向野指针宣战
c语言·开发语言·c++·算法·c#
czhc114007566311 小时前
# ProcessJob 构造函数 — 语法与概念
c#
用户2986985301412 小时前
无需安装 Excel,也能轻松将 CSV 转为 XLS 或 XLSX
后端·c#·excel
在世修行12 小时前
从零打造 C# 工业视觉检测系统(五):相机连接、连续取流与双路实时预览
数码相机·c#·视觉检测
JckOLF04Z12 小时前
C#客户端的异步操作
开发语言·c#