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

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

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

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

Copy

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提供了非常多的重载方法,其中有两个重载方法是,

Copy

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

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

Copy

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

原文地址:https://www.cnblogs.com/lonelyxmas/p/12154158.html

时间: 2024-10-08 09:14:02

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

小技巧:快速清除项目中的svn相关文件!

习惯使用svn作为源代码管理工具,安全可靠 但是这些.svn字样的文件夹及文件也会随着源代码一同被deploy到Tomcat中,除了看着碍眼,也会占用Tomcat的性能 每次都是在项目部署目录里,搜索.svn,同时要选择显示隐藏文件,然后再全部删除,好麻烦 无意中发现个小脚本,导入到注册表之后,就会生成一个右键菜单,点击后就能一次性清空所选文件夹下全部的svn文件夹和文件,真实技术改变生活呀! ClearSvnFolders.rar

C#(HTML)_小技巧_关于textbox框中不能输入HTML标签的解决方法(如输入“<p>”后,在提交表单时系统会崩溃)

主要修改文件是config文件(Web.config): 1.在<pages>标签中添加属性:validateRequest="false" <pages validateRequest="false"> </pages> 2.在<httpRuntime>标签中添加属性:requestValidationMode="2.0" <httpRuntime  requestValidationMod

iOS开发小技巧--获取自定义的BarButtonItem中的自定义View的方法(customView)

如果BarButtonItem是通过[[UIBarButtonItem alloc] initWithCustomView:(nonnull UIView *)]方法设置的.某些情况下需要修改BarButtonItem中自定义View的某些属性,例如显示的文字或者显示的图片. 可以通过BarButtonItem的customView获取自定义的View.

iOS开发小技巧--富文本字典集合中的Key都是OC中的常量字符串

JQuery中的小技巧,,,连载中。。。

获取下拉框中选中项的文本等操作 jQuery获取Select元素,并选择的Text和Value:  1.获取select 选中的 text : $("#ddlRegType").find("option:selected").text(); 2.获取select选中的 value: $("#ddlRegType ").val(); $("#select_id").change(function(){//code...}); /

iOS开发小技巧--适当的清空模型中的某个数据,达到自己的需求,记得最后将数据还原(百思项目评论页面处理最热评论)

一.项目需求,显示所有贴的时候,需要显示最热评论,但是点击进入相应帖子后,最热评论的label不要显示,如图: 解决方案 -- 该暂时保存的暂时保存,该清空的清空                                                                              最后记得还原数据,不还原数据的话,后果很严重               

小技巧,如何在Label中显示图片

这个需求其实是有的,比如QQ聊天界面里面发送的信息,可以用label来显示文字(也可以用button显示),但是有时候用户可能会发送图片.如果能让Label遇到文字就显示文字,遇到图片就显示图片就好了.可能有的人会说用Quartz2D,直接在Label的drawinrect 里面用上下文画上去.但这感觉太刻意去弄了,而且比较麻烦. 如果你不是在董铂然博客园看到本文,请点击查看原文 推荐一种用Label系统的属性来做. 1 2 3 4 5 6 7 8 9 10 UIImage *image = [

日常小技巧:取到int中各位数字的方法

String numStr = String.valueOf(num); for(int i=0;i<numStr.length();i++){ //对于输入int值num,先转为String,然后用每一位的char减去'0'即可得到相应位上的数字:    int numInput = numStr.charAt(i) - '0'; }

Shell脚本编程小技巧(1)-如何解决脚本中多行重定向结束符不用对齐到行首

1.what?问题需求是什么? 首先需求从何而来呢,主要是编写shell脚本,用cat 进行多行输入重定向的时候,结束符必须要对齐行首,格式不好看. 2.how?怎么解决这个问题? 首先百度,google搜索了下,结果就是说的多的就是shell多行重定向没有解决实际问题,可能是搜索的关键字不对.人工智能检索发现了一篇好文,人家写的比我好,大家自行浏览:[https://segmentfault.com/a/1190000008130200]主要是用了<<- 3.why?什么原理呢? 其实换个思