[小技巧]你真的了解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 ...
随机推荐
- 【JavaEE】之MyBatis开发DAO
在SSM框架中的DAO层就是MyBatis中的Mapper,Mapper分为两部分:Mapper接口(JAVA文件)和Mapper映射文件(XML文件).DAO开发(Mapper开发)有两种方式:原始 ...
- rug
rug()函数 :给图添加rug representation. · 一维的 · rug的方式是补充,仅仅包括落在图像区域内的x的值,丢失掉任何有限的值,将会被警告:而丢失任何非有限的值,则静静地丢失 ...
- Nuget Server的搭建及实践之旅
一. 背景 在做的一个项目使用的是Asp.Net MVC,由于缺少规范与约束,团队成员在使用类库各自为政,时常出现路径和版本不一致的问题.在一个同事建议下,开始尝试使用Nuget 管理项目或公司使用的 ...
- css练习——两列左窄右kuan型
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 饶有特色的 CSS3 展示横条.html
- 模板引擎Thymeleaf
1.Thymeleaf简介 Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点 Thyme ...
- Java修炼——文件字节输入输出流复制和缓冲流复制
一:文件字节输入输出流复制 首先明确数据源和目的文件,然后就是"中转站",最后就是关闭 package com.bjsxt.ioproject; import java.io.Fi ...
- Spring Data-Spring整合Hibernate基于JPA规范
JPA:由 Sun 公司提供了一对对于持久层操作的标准(接口+文档) Hibernate:是 Gavin King 开发的一套对于持久层操作的自动的 ORM 框架. Hibernate JPA:是在 ...
- 图形界面GUI
JFrame jframe = new JFrame(); //创建一个窗口 jframe.setVisible(true) //设置窗口显示 jframe.setLocation() //设置窗口位 ...
- Proxmox VE虚拟化管理平台-相关概念
请阅读此文用户务必阅读以下链接,其中包含了汉化作者.张自然copy过来的原因等信息. www.zhangziran.com/proxmox-docs-zh-cn.htm a Proxmox VE 集群 ...