[小技巧]你真的了解C#中的Math.Round么?

今天在某.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);
[小技巧]你真的了解C#中的Math.Round么?的更多相关文章
- java 中的 Math.round(-1.5) 等于多少?(未完成)
java 中的 Math.round(-1.5) 等于多少?(未完成)
- sql server 小技巧(2) 删除sql server中重复的数据
with list_numbers as ( select Name, AuthorOrTime, Url, Price, EstimatePrice, Size, Category, ROW_NUM ...
- 【HTML5游戏开发小技巧】RPG情景对话中,令文本逐字输出
以前用JAVAscript实现过令文本逐字输出的效果,今天我来用html5中的canvas实现一下.canvas里的内容可不像<p>那样好操作,首先,你需要懂得一些html5的API才能操 ...
- 【HTML5游戏开发小技巧】RPG情形对话中,令文本逐琢夸出
从前用JAVAscript完成过令文本逐琢夸出的效果,明天嗡炒用html5中的canvas完成一下.canvas里的内容可没有像<p>那样好操做,起首,您需求懂得一些html5的API才气 ...
- 小技巧:快速清除项目中的svn相关文件!
习惯使用svn作为源代码管理工具,安全可靠 但是这些.svn字样的文件夹及文件也会随着源代码一同被deploy到Tomcat中,除了看着碍眼,也会占用Tomcat的性能 每次都是在项目部署目录里,搜索 ...
- Android开发的小技巧,在Android Studio中使用Designtime Layout Attributes
在编写xml文件时,为了预览效果,经常会使用默认填上一些内容,比如TextView时,随便写上一个text <TextView ... android:text="Name:" ...
- iOS开发小技巧--获取自定义的BarButtonItem中的自定义View的方法(customView)
如果BarButtonItem是通过[[UIBarButtonItem alloc] initWithCustomView:(nonnull UIView *)]方法设置的.某些情况下需要修改BarB ...
- C#(HTML)_小技巧_关于textbox框中不能输入HTML标签的解决方法(如输入“<p>”后,在提交表单时系统会崩溃)
主要修改文件是config文件(Web.config): 1.在<pages>标签中添加属性:validateRequest="false" <pages val ...
- Nmap小技巧——探测大网络空间中的存活主机
Nmap快速探测空间主机是否存活的技巧(来自lijiejie师傅): nmap -v -sn -PE -n --min-hostgroup --min-parallelism -oX nmap_out ...
随机推荐
- 2019-2020-7 20199317《Linux内核原理与分析》第七周作业
第6章 进程的描述和进程的创建 1 进程的描述 操作系统内核实现操作系统的三大管理功能,即进程管理.内存管理和文件系统.其中,操作系统内核中最核心的功能是进程管理.为了管理进程,内核要 ...
- CSS+HTML实现移动端div左右滑动展示
由于手机屏幕的宽度有限,内容太多移动设备一行装不下的,所以很多移动端网站的导航栏都有左右滑动效果,下面我就用CSS+HTML实现移动端div左右滑动展示. CSS:box设置文本不换行,子元素box1 ...
- Spring MVC上传文件原理和resolveLazily说明
问题:使用Spring MVC上传大文件,发现从页面提交,到进入后台controller,时间很长.怀疑是文件上传完成后,才进入.由于在HTTP首部自定义了“Token”字段用于权限校验,Token的 ...
- Selenium 4.0 Alpha更新实践
上期讲到了Selenium 4.0 Alpha更新日志,这次来实践一下更新内容. DevTools操作更加方便. Chrome录制更加方便.(未实践) 窗口管理不在依赖一个driver. 相对定位器功 ...
- Dubbo源码分析之 SPI(一)
一.概述 dubbo SPI 在dubbo的作用是基础性的,要想分析研究dubbo的实现原理.dubbo源码,都绕不过 dubbo SPI,掌握dubbo SPI 是征服dubbo的必经之路. 本篇文 ...
- yuv和yCbCr的差异
一.和rgb之间换算公式的差异 yuv<-->rgb Y'= 0.299*R' + 0.587*G' + 0.114*B' U'= -0.147*R' - 0.289*G' + 0.436 ...
- art-template模板判断
1.添加模板 <script id="userinfo" type="text/template"> {{ if id == n ...
- 各种常用js函数实现
1.bind function bind(fn, context) { var args = Array.prototype.slice.call(arguments, 2); retur ...
- JS系列:js节点
节点(node) 在html文档中出现的所有东西都是节点 元素节点(HTML标签) 文本节点(文字内容) 注释节点(注释内容) 文档节点(document) … 每一种类型的节点都会有一些属性区分自己 ...
- mini_magick上传图片
rails上传图片需要用到的gem: gem 'carrierwave'gem 'mini_magick' 在项目Gemfil中添加上面的两个gem,然后bundle install 然后创建modl ...