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

这篇具有很好参考价值的文章主要介绍了C#中四舍五入的正确写法是什么?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


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


一、BUG回顾

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

代码:
C#中四舍五入的正确写法是什么?
效果:
C#中四舍五入的正确写法是什么?
源码:

 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)】就可以解决啦。官方是这样描述的:"当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值"。

代码:
C#中四舍五入的正确写法是什么?
效果:
C#中四舍五入的正确写法是什么?
源码:

        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);//使用

原文链接:https://www.cnblogs.com/kimiliucn/p/17622687.html文章来源地址https://www.toymoban.com/news/detail-646899.html

到了这里,关于C#中四舍五入的正确写法是什么?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实现真正的四舍五入

    Python 内置的函数 round() 能够大致实现四舍五入的功能,但会存在部分场景不适用,比如: 网上搜了一圈,只找到了 Decimal 的替代解决方法,但看了貌似比较复杂,经过思考一番,只有遇到尾数为 5 的情况下,才会计算有偏差,那直接把 5 加 1 变成 6,不就可以轻松解决了

    2024年02月11日
    浏览(49)
  • 语法-Java四舍五入等详解

    long round(double d) int round(float f) ​ Math.round()是Java中经典的舍入数字方法, 它返回的是整数 ,也就是说对浮点数四舍五入成整数。 ​ Java的最佳实践是优先使用BigDecimal而不是Math.round()来对Java的数字进行四舍五入。每当需要将数字四舍五入到小数点后n位时,首先考虑BigDecimal。

    2024年02月15日
    浏览(40)
  • Java中的取整、四舍五入

    目录 1、直接强制转换--取整 2、Java提供的函数  参考文献 结果: 直接用强制转换的方式将浮点型数据转换为整型时, 直接去掉小数点后部分的精度,取整数部分 ; 直接强制取整有精度风险 一方面是小数位损失 另一方面当浮点型数字超过整型数字最大值时,会发生溢出 实

    2024年02月14日
    浏览(40)
  • java四舍五入方法的基础学习

    以下均为自己的学习复习资料,如有不对的地方请发在评论区中,我会仔细思考并作出修改,大家共同学习,谢谢! 主要资料可以从java.base (Java SE 17 JDK 17) (oracle.com)(java文档)中查找到 四舍五入分为三种: 向上取整 、 向下取整 、 四舍五入 。 先给实例再谈理解: 向上取整

    2024年02月07日
    浏览(40)
  • 【Python中四舍五入round()方法】

    选择题 以下python代码分别输出什么? x=2.34677432 print(round(x)) print(round(x,3)) A: 2   2.34 B: 3   3.467 C: 2   2.347 D: 7   7.040   欢迎大家转发,一起传播知识和正能量,帮助到更多人。期待大家提出宝贵改进建议,互相交流,收获更大。辛苦大家转发时注明出处(也是咱们公益编程交

    2023年04月08日
    浏览(32)
  • java实现BigDecimal/int四舍五入

    输出结果: 四舍五入(保留位后一位是5进位) = 2.4 四舍五入(保留位后一位是5舍弃) = 2.3 四舍五入(保留位是奇数) = 4.6 四舍五入(保留位是偶数) = 4.4 进位 = 2.4 说明: ROUND_CEILING Rounding mode to round towards positive infinity. 向正无穷方向舍入 ROUND_DOWN Rounding mode to round towards zero. 向零方向

    2024年02月09日
    浏览(40)
  • java四舍五入常用的2种方法

    1.Math.round Math.round ()是Java中舍入数字的经典方法,Math.round(变量名称)这种返回的其实是整数,也就是说 四舍五入之后是整数 。   该方法有以下几种语法格式: 示例:  输出结果为: 101 101 100 90  如果要输出百分比(记得乘100): 2.DecimalFormat 对Java中 DecimalFormat 的所有基础用法进

    2024年02月16日
    浏览(35)
  • Verilog FPGA实现除法——整除与四舍五入

    Verilog FPGA实现除法——整除与四舍五入 在FPGA开发中,实现除法计算是非常必要的。本文将介绍如何使用Verilog语言实现除法计算,包括整除和四舍五入两种情况。 整除实现 在Verilog中,整除的实现可以通过比较被除数是否大于等于除数来进行。具体步骤如下: 将除数与被除数

    2024年02月08日
    浏览(37)
  • 小程序保留2位小数据,不四舍五入

    目录  方法1: parseInt + toFixed 方法2:Math.floor + tofixed ### 方法3:parseFloat() ,较为准确==》    方法1: parseInt + toFixed 输出 : 58766.99999999999 587.66 -0.11 -1.00 -12.99 -12.99  有问题:  587.67 转换之后 587.66  方法2:Math.floor + tofixed 输出: -0.12 -1.00 -13.00 -13.00   有问题-12.99 得出

    2024年02月13日
    浏览(35)
  • 【大坑】MyBatisPlus使用updateById莫名将数据四舍五入了

    我目前在为本地的一所高中开发一个成绩分析的网站,后端使用的是SpringBoot+MyBatisPlus,业务逻辑是用户在前端上传EXCEL文件,后端从文件中读取成绩存到数据库用于分析。但是奇怪的是:在后端, 进入数据库之前的成绩数据是64.5,到数据库之后就变成了65.0 。 代码如下: 从

    2024年01月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包