C# Math.Round()四舍五入、四舍六入五成双

2023-09-14 15:51:50

开发者为了实现小数点后 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);
更多推荐

[python 刷题] 49 Group Anagrams

[python刷题]49GroupAnagrams题目:Givenanarrayofstringsstrs,grouptheanagramstogether.Youcanreturntheanswerinanyorder.AnAnagramisawordorphraseformedbyrearrangingthelet

界面控件DevExpress WinForms HTML-CSS模板:预设计UI模板加速.NET应用开发

在过去的一年里,DevExpress官方引入了两个强大的功能来加速/简化.NET桌面应用的开发,当一起使用时,您可以创建优雅/个性化的用户界面,减少重复的代码,从而节省更多的项目时间。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。同时能完美构建

Linux线程之信号量(semaphore)

Linux信号量1.头文件2.类型2.1.类型值3.接口3.1.信号量接口3.1.1动态初始化资源3.1.2.动态释放资源3.1.3.信号量锁定3.1.4.带超时时间的信号量锁定3.1.5.不阻塞信号量锁定3.1.6.信号量解锁3.1.6.获取当前信号量的值4.示例4.1.信号量示例1.头文件#include<sema

Linux Day15:线程安全

一、线程安全方法线程安全即就是在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是一样的、正确的。那么就说这些线程是安全的。要保证线程安全需要做到:1)对线程同步,保证同一时刻只有一个线程访问临界资源。(信号量,互斥锁,读写锁,条件变量)2)在多线程中使用线程安全的函数(可重入函数),所谓线程安全的函数指的是:如

Linux动态库

定义:动态函数库,是在程序执行时动态(临时)由目标程序去调用优点:调用时不复制,程序运行时动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。缺点:加载速度比静态库慢,占用内存大

《动手学深度学习》(pytorch版+mxnet版)2023最新

我又来推书了,这次分享的这本书可是重量级,目前已经被55个国家300所大学用于教学,同时受到了学术界与工业界的强烈推荐。这本书就是李沐、阿斯顿·张、立顿、斯莫拉四位大佬联合编写的《动手学深度学习》。本书面向中文读者,能运行、可讨论,适合本科生、研究生、工程师以及研究人员学习。书籍pdf文末获取书籍介绍全书采用公式+图示

安卓设备监听全部输入信号

前言:最近团队收到一个产品需求,需要监听安卓设备上用户是否有输入行为,以免定制推荐的时候打搅到用户。这里指的是设备上所有应用的输入行为,而不是单指某一个应用。这个需求还是蛮有挑战性的,需要涉及到很多FW层的知识,所以围绕着这个需求,定制了多个方案,并且也找了许多人进行讨论,总算有了一个相对可行的方案,因此,通过本文记录

图像处理的创意之旅:逐步攀登Python OpenCV的高峰

目录介绍OpenCV简介安装OpenCV加载和显示图像图像处理目标检测图像处理的高级应用视频处理综合案例:人脸识别应用总结介绍欢迎来到本篇文章,我们将一起探索如何使用Python中的OpenCV库进行图像处理和计算机视觉任务。无论您是初学者还是有一定编程经验的开发者,本文将从入门到精通地引导您,帮助您理解OpenCV的

Windows 上的本机 Android 开发入门

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录安装AndroidStudio创建新项目Java或Kotlin最低API级别即时应用支持和Androidx项目项目文件使用C或C++进行Android游戏开发设计指南FluentDesignSystemforA

在 Android 设备或仿真器上进行测试

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录WindowsDefender概述如何将排除项添加到WindowsDefenderAndroid开发时要考虑的排除项本指南介绍如何在WindowsDefender安全设置中设置排除项,以便在使用Windows计

vue基础知识十二:双向数据绑定是什么

一、什么是双向绑定我们先从单向绑定切入单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定举个栗子当用户填写表单时,View的状态就被

热文推荐