C#中的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);
参考地址:https://www.cnblogs.com/lwqlun/p/12070839.html
C#中的Math.Round的更多相关文章
- [小技巧]你真的了解C#中的Math.Round么?
今天在某.NET Core 群中看到有人在问Math.Round的问题.其实这个问题之前有很多人遇到了,在此总结一下. 开发者为了实现小数点后 2 位的四舍五入,编写了如下代码, var num = ...
- java 中的 Math.round(-1.5) 等于多少?(未完成)
java 中的 Math.round(-1.5) 等于多少?(未完成)
- C#中Math.Round()实现中国式四舍五入
C#中Math.Round()实现中国式四舍五入 C#中的Math.Round()并不是使用的"四舍五入"法.其实在VB.VBScript.C#.J#.T-SQL中Round函数都 ...
- js中Math.round、parseInt、Math.floor和Math.ceil小数取整小结
以前经常在代码中看到Math.round.parseInt.Math.floor和Math.ceil这四个函数,虽然知道结果都可以返回一个整数,但是对他们四者的区别还是不太清楚,今天就做一个小结. 一 ...
- js中Math.round、parseInt、Math.floor和Math.ceil小数取整小结【转】
[摘要:之前常常正在代码中看到Math.round.parseInt.Math.floor战Math.ceil那四个函数,固然晓得效果皆能够返回一个整数,然则对他们四者的差别照样没有太清晰,本日便做一 ...
- C#中Math.Round()的中国式用法
C#中的Math.Round()并不是使用的"四舍五入"法.而是(银行家算法),即:四舍六入五取偶.事实上这也是IEEE的规范,因此所有符合IEEE标准的语言都应该采用这样的算法. ...
- C#中Math.Round()实现中国式四舍五入问题
C#中的Math.Round()并不是使用的"四舍五入"法.实际上是四舍六入五取偶. 对于这个问题我们常见的解决方式是使用MidpointRounding.AwayFromZero ...
- JavaScipt中的Math.ceil() 、Math.floor() 、Math.round()、Math.pow() 三个函数的理解
以前一直会三个函数的使用产生混淆,现在通过对三个函数的原型定义的理解,其实很容易记住三个函数. 现在做一个总结: 1. Math.ceil()用作向上取整. 2. Math.floor()用作向下取整 ...
- C#中,使用显式类型转换(int)和Math.Round方法,将浮点数转换为整数的区别
主要区别就是,显式类型转换(int)是将浮点数的整数部分截取出来,然后转换为整数,所以相当于是向下取整.而Math.Round方法是对浮点数进行四舍五入后,转换为整数. 新建一个.NET Core控制 ...
- js中Math.round、parseInt、Math.floor和Math.ceil小数取整总结(转)
js中Math.round.parseInt.Math.floor和Math.ceil小数取整总结 Math.round.parseInt.Math.floor和Math.ceil 都可以返回一个整数 ...
随机推荐
- Conda 使用
简介 Conda 和 Anaconda.Miniconda 的关系 Conda 是一个包管理器及环境管理器. Anaconda 和 Miniconda 都是一种 Python 和 R 发行版,其包括了 ...
- 一个操作系统的设计与实现——第19章 IA32-e模式
19.1 64位段描述符与GDT 在32位操作系统中,我们使用的是平坦模型而非分段模型,从而,段描述符的段基址和段限长均成了摆设.在64位模式下,就连CPU也淘汰了分段模型,转而固定使用平坦模型. 6 ...
- java-GUI编程之布局类型介绍
java使用AWT和Swing相关的类可以完成图形化界面编程,其中AWT的全称是抽象窗口工具集(Abstract Window Toolkit),它是sun公司最早提供的GUI库,这个GUI库提供了一 ...
- 【转】AddMvcCore,AddControllers,AddControllersWithViews,AddRazorPages的区别
1.services.AddMvcCore()只註冊運行 Controller/Razor Pages 必要的核心服務,確保 Pipeline 程序可動作,其餘如像 Data Annotation M ...
- Spark 知识
Spark 学习 Spark(一): 基本架构及原理 https://www.cnblogs.com/xing901022/p/8260362.html https://www.cnblogs.com ...
- HTML & CSS – Styling Table
前言 Table (表格) 历史悠久, 它有许多独特的默认样式, 它也是最早的布局方案方案哦 (现在依然有用 table 来做布局的, 比如 email template). 这篇来介绍一下基本的 t ...
- 记一次 公司.NET项目部署在Linux环境压测时 内存暴涨分析
一:背景 讲故事 公司部署在某碟上的项目在9月份压测50并发时,发现某个容器线程.内存非正常的上涨,导致功能出现了异常无法使用.根据所学,自己分析了下线程和内存问题,分析时可以使用lldb或者wind ...
- C++11新初始化方法 使用{}初始化变量
列表初始化 在C++11及以后的版本中,使用{}来初始化变量是一种新的初始化方法,称为列表初始化(List Initialization).这种初始化方法可以用来初始化内置类型.自定义类型以及聚合类型 ...
- 将Sublime Text添加到鼠标右键
事件起因: 在众多 文本文档软件中,个人用过比较多,notepad++ / Edit / EditPlus / notepad-- / Sublime Text 等等,但是比较偏爱的还是 Subl ...
- Foxmail 设置个人签名的方法
事件起因: 在foxmail设置一个好看的个人签名 具体设置过程: 打开Foxmail - 右上角设置 -写邮件 签名的设置 字体格式:等线 10px 黑色 内容: 名字 | 名字英文 职位 个人邮箱 ...