今天在某.NET Core 群中看到有人在问Math.Round的问题。其实这个问题之前有很多人遇到了,在此总结一下。

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

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

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

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

四舍六入五成双

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

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

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

例如:

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

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

Math.Round的四舍五入

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

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

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 - 四舍六入五成双

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

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

最新文章

  1. less简单用法
  2. WPF ListView 排序
  3. 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器
  4. tomcat下的https项目创建与部署
  5. ThinkPHP 关联模型中查询某条记录的父级(非查询子级)
  6. java运算符的优先级
  7. PB中用回车键实现tab键的功能
  8. 使用MSSM管理工具登录LOCALDB
  9. Tomcat从零开始(十)Loader
  10. CSF 中的应用程序请求路由
  11. delphi程序设计之底层原理(有些深度)
  12. Python什么是二次开发的意义?python在.net项目采用
  13. 趣味Java算法题(附答案)
  14. vue项目的骨架及常用组件介绍
  15. 云技术:弹性计算ECS
  16. php扩展打开不起作用的原因, php数字显示2147483647的原因
  17. 手机响应式echarts
  18. Ubuntu中安装deb包程序
  19. JXL生成Excel,并提供下载(2:提供下载)
  20. json-lib.jar开发包及依赖包的下载地址(转)

热门文章

  1. 【Android - IPC】之ContentProvider简介
  2. jenkins + maven + nexus + [ svn 或 GitLab 或 GitHub ]
  3. window.open()打开新窗口 及参数
  4. 用Python调用华为云API接口发短信
  5. L1 loss, L2 loss以及Smooth L1 Loss的对比
  6. git的基本使用-1
  7. SDK版本管理
  8. R语言for循环
  9. ARTS-S anaconda常用命令
  10. 基于iSensor的MT9M001C12STM传感器调试总结