首页 > 编程语言 >C#中四舍五入的正确写法是什么?

C#中四舍五入的正确写法是什么?

时间:2024-10-23 16:02:01浏览次数:1  
标签:四舍五入 Console C# price 舍去 写法 Round Math

四舍五入是一种精确度的计数保留法。在取小数近似数的时候,如果尾数的最高位数字是4或者比4小,就把尾数去掉。如果尾数的最高位数是5或者比5大,就把尾数舍去并且在它的前一位进"1",这种取近似数的方法叫做四舍五入法。


一、BUG回顾

我们经常使用四舍五入时,会使用【Math.Round(价格,2)】这种方法进行转换。而我也不例外,在计算价格时也是使用这个方法,而当遇到类似这样的数值时【301.505 】,返回的值却是【301.5】,按照四舍五入的原则,应该返回【301.51】才对是吧。

代码:
image.png
效果:
image.png
源码:

 static void Main(string[] args)
        {
            double price = 320.75 * 0.94;

            Console.WriteLine(price);//301.505
            Console.WriteLine(Math.Round(price, 2));//301.5

            Console.ReadKey();
        }

那这是为什么呢?根据引用ChatGPT回答如下:

在C#中,Math.Round()函数默认使用的是银行家舍入法(Banker's rounding),即当小数部分为5时,会根据前一位数字的奇偶性来决定舍入方式。因此,1.085经过Math.Round(301.505,2)舍入后的返回值是301.5,而不是301.51.


**按照【银行家舍入法(Banker's rounding)】规则如下:**

1、当舍去位的数值小于5时。直接舍去。

2、当舍去位的数值大于6时,进位加1。

3、当舍去位的数值等于5时,分两种情况:

(1)若5后面有其他非0数字(即5不是最后一位)时,进位加1

(2)若5后面只有0(即5是最后一位)时,则根据5的前一位的奇偶来判断,前一位为奇数则进位加1,为偶数则舍去。

遇到5需要舍去的情况只有一种,即5是最后一位有效数且前一位数是偶数。

但是这种转换在国内很多企业就行不通了,那如何解决呢?请看下面方法。


二、解决掉BUG

我们可以这样写【Math.Round(价格, 2, MidpointRounding.AwayFromZero)】就可以解决啦。官方是这样描述的:"当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值"。

代码:
image.png
效果:
image.png
源码:

        static void Main(string[] args)
        {
            double price = 320.75 * 0.94;

            Console.WriteLine(price);//301.505
            Console.WriteLine(Math.Round(price, 2));//301.5

            double res = Math.Round(price, 2, MidpointRounding.AwayFromZero);
            Console.WriteLine(res);///301.51

            Console.ReadKey();
        }

三、封装方法

为了能快速使用,为此封装了一个公共方法。

封装代码:

 /// <summary>
    /// Math辅助类
    /// </summary>
    public static class MathHelper
    {
        /// <summary>
        /// 四舍五入
        /// </summary>
        /// <param name="value">值</param>
        /// <param name="digits">保留的小数位数(默认:2位)</param>
        /// <returns></returns>
        public static double MathHalfAdjust(double value, int digits = 2)
        {
            return Math.Round(value, digits, MidpointRounding.AwayFromZero);
        }
    }
C# 复制 全屏

调用实例:

MathHelper.MathHalfAdjust(12.105, 2);//使用

标签:四舍五入,Console,C#,price,舍去,写法,Round,Math
From: https://www.cnblogs.com/raincedar/p/18496595

相关文章

  • kubesphere搭建nacos2.2.3(MySQL)
    环境准备创建nacos数据库,sql来自于nacos官网,自行查找并执行启动环境配置如图具体配置如下具体含义请参考nacos官网#***************SpringBootRelatedConfigurations***************####Defaultwebcontextpath:server.servlet.contextPath=/nacos###Inc......
  • pbootcms网站后台编辑器加载不出来怎么办?
    当遇到PbootCMS网站后台编辑器加载不出来的问题时,可以尝试以下几种解决方法:检查网络连接:确保服务器与客户端之间的网络连接正常。尝试刷新页面或重新登录后台。清理缓存:清理浏览器缓存和cookies,有时候旧的缓存数据会导致加载问题。在PbootCMS后台尝试清空系统缓存。......
  • PbootCMS执行SQL发生错误!错误:no such column: def1
    当您在升级PbootCMSv3.0.6版本时遇到“执行SQL发生错误!错误:nosuchcolumn:def1”或“执行SQL发生错误!错误:duplicatecolumnname:picstitle”的提示,通常是因为数据库字段没有正确添加或已经存在。以下是一些解决方法:解决步骤备份数据库:在进行任何数据库操作之前,务必先备......
  • pbootcms后台登录验证码看不清的解决办法
    原因分析PHP版本过低:pbootcms后台登录验证码可能因为使用的PHP版本太低而不被支持,导致显示问题。解决办法升级PHP版本:新版pbootcms已经不再支持PHP7.0以下的版本,建议将PHP版本升级到7.0或更高。可以通过服务器控制面板(如cPanel、Plesk等)进行PHP版本的切换。如果是自......
  • 5G NR GSCN计算SSB中心频率MATLAB实现
    本期给大家带来5GNR中已知GSCN如何计算SSB的中心频率,用MATLAB实现,参考3GPP38.104下图是GSCN与SSB中心频率换算关系。函数说明:函数的入参是GSCN号函数的输出是对应的SSB中心频率,单位MHZfunction freqency =nr_5g_gscn2freq(gscn)%%%%author:老牛% codingti......
  • pbootcms如何修改后台的登陆地址/账号以及密码
    1.修改后台登录地址PBootCMS默认的后台登录地址通常是 http://yourdomain.com/admin.php。为了增加安全性,可以修改后台登录地址。步骤编辑路由配置文件找到并编辑 system/route/admin.php 文件。修改 admin.php 的路由规则。例如,将 admin.php 改为 backend.php:......
  • 高效集成:小满OKKICRM与金蝶云星空的数据对接案例
    小满OKKICRM数据集成到金蝶云星空的技术案例分享在企业信息化建设中,数据的高效集成和管理是关键环节。本文将聚焦于一个实际运行的系统对接集成案例:小满客户=>金蝶客户(覆盖)--ok_copy,通过数据集成平台实现小满OKKICRM的数据无缝对接到金蝶云星空。为了确保数据集成过程的高效性和......
  • 安装 堡垒机 docker
    参考 Docker部署常见应用之企业级堡垒机JumpServer_jumpserverdocker-CSDN博客 创建文件夹mkdir-p/opt/jumpserver/core/datamkdir-p/opt/jumpserver/koko/datamkdir-p/opt/jumpserver/lion/datamkdir-p/opt/jumpserver/kael/datamkdir-p/opt/jumpserver/che......
  • KBPC1010-ASEMI新能源专用方桥KBPC1010
    编辑:llKBPC1010-ASEMI新能源专用方桥KBPC1010型号:KBPC1010品牌:ASEMI封装:KBPC-4安装方式:直插批号:2024+现货:50000+正向电流(Id):10A反向耐压(VRRM):1000V正向浪涌电流:200A正向电压(VF):1.10V引脚数量:4芯片个数:4芯片尺寸:MIL功率(Pd):中小功率工作温度:-55°C~150°C类型:整流方......
  • 洛谷 P3128 [USACO15DEC] Max Flow P 做题记录
    因为一次添加会对点和边都造成影响,而点一次能加两个,于是最大值一定在点上。由于只有一次询问,考虑树上差分。设一次询问给出的两点为\(x,y\),那么我们在\(x\)和\(y\)处分别加\(1\),在\(\operatorname{lca}(x,y)\)处减\(1\),因为该点本身也有增加,于是我们在它的父节点再减去......