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

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

时间:2023-08-11 12:32:15浏览次数:44  
标签:舍入 四舍五入 Console C# price 写法 Round Math

概述:就在今天,测试提一个BUG,是什么呢?就是在计算商品采购价时,需要保留2位小数,当时是使用【Math.Round(采购价,2)】这种方法进行四舍五入的,但是这样写会有问题,至于什么问题呢,来看看这篇文章就对了!


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


一、BUG回顾

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


代码:

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


效果:

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


源码:

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.


然后四舍五入也有个国际惯例,叫奇进偶舍 。就是当舍入位前面一位是奇数时就进,为偶数时就舍。但是这种转换在国内很多企业就行不通了,那如何解决呢?请看下面方法。


二、解决掉BUG

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

代码:

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


效果:

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


源码:

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);
        }
    }


调用实例:

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

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

版权声明:本文为原创文章,版权归 [西瓜程序猿] 所有,转载请注明出处,有任何疑问请私信咨询。

原文链接:https://blog.51cto.com/kimiliucn/7045942


标签:舍入,四舍五入,Console,C#,price,写法,Round,Math
From: https://blog.51cto.com/kimiliucn/7045942

相关文章

  • torchvision中的数据集使用
    torchvision中的数据集使用1.torchvision介绍torchvision是pytorch的一个图形库,它服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型,一般包括左侧几个模块。pytorch官网-Docs-torchvision(左侧修改为0.90版本就可以直接看到datasets)torchvision.datasets:包含常用的数据......
  • INFINI Labs 产品更新 | Easysearch 支持 SQL 查询、Console 告警功能支持邮件等多渠
    INFINILabs产品又更新啦~。本次更新概要如下:Easysearch新增SQL插件和JDBC驱动,支持SQL查询,支持SQL常用函数等;Console针对告警功能做了升级优化,新增了邮件渠道,支持自定义邮件服务器配置,以及支持飞书、钉钉、企业微信、Discord、Slack等多渠道Webhook发送告警通知,优化......
  • SpringBoot打包war部署到tomcat
    项目结构:pom.xml:<!--①指定打包成war--><packaging>war</packaging><dependencies><!--starter-web:spring-webmvc+autoconfigure+logback+yaml+tomcat--><dependency><groupId>org.springframework.b......
  • chatGPT3.5搭建git
    https://github.com/Chanzhaoyu/chatgpt-webdocker-compose.yamlversion:'3'services:app:image:chenzhaoyu94/chatgpt-web#总是使用latest,更新时重新pull该tag镜像即可ports:-10.0.0.250:3232:3002environment:#二选一......
  • FCKEditor可以如何直接复制word的图文内容到编辑器中?
    ​  自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了。一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器)中时,编辑器都无法自动上传图片。需要用户手动一张张上传Word图片。如果只有一张图片还能......
  • 写测试用例、重构函数、生成SQL查询……原来CodeGeeX还能做这些!
    CodeGeeX中的智能问答功能“AskCodeGeeX”可以帮助程序员解答开发过程中遇到的问题。但是“AskCodeGeeX”的能力不止于此,用它还能帮助程序员高效编写测试用例,添加代码调试信息,实现SQL语句等等。如果你还不知道如何实现,下面我们一起来看几个例子,看看程序员拥有一个超级编程助手,......
  • C#中四舍五入的正确写法是什么?
    概述:就在今天,测试提一个BUG,是什么呢?就是在计算商品采购价时,需要保留2位小数,当时是使用【Math.Round(采购价,2)】这种方法进行四舍五入的,但是这样写会有问题,至于什么问题呢,来看看这篇文章就对了!四舍五入是一种精确度的计数保留法。在取小数近似数的时候,如果尾数的最高位数字是4......
  • 使用LiveData、ViewModel在Activity和Fragment,Fragment和Fragment之间共享数据
    一、概述传统的Activity与Fragment之间共享数据,Fragment与Fragment之间共享数据,我一般会采用EventBus事件总线来实现。不过现在可以借助另外一种简单的方式LiveData+ViewModel也可以实现这种共享二、代码示例示例描述:要求FragmentA发送出数据,FragmentB和Activity都能接......
  • mysql Error 1264: Out of range value for column 'balance' at row 1
    报错原因:值超出列的范围可能原因:原因1:值超出其可输入的范围。解决方法:设置的为INT,可以把列的值改为BIGINT,或者改成其他数据类型。原因2:新版本的MySQL对字段的严格检查。解决方法:修改my.ini,将sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"......
  • CI+JUnit5并发单测机制创新实践
    一.现状·问题针对现如今高并发场景的业务系统,“并发问题”终归是必不可少的一类(占比接近10%),每次出现问题和事故后,需要耗费大量人力成本排查分析并修复。那如果能在事前尽可能避免岂不是很香?二.分析原因当前并发测试多数依赖测试人员进行脚本测试,同时还依赖了研发和产品识......