美文网首页
Python 实现传统意义上的四舍五入

Python 实现传统意义上的四舍五入

作者: welder77 | 来源:发表于2023-02-11 17:41 被阅读0次

    其实要让Python实现传统意义上的四舍五入法,并没有之前想象的那么简单。
    原因就在于Python默认提供的解决方案,使用的是round函数,而round函数实现的是奇进偶舍法,又称为四舍六入五成双规则、银行进位法。

    这种方法的特点如下:

    1. 要求保留位数的后一位如果是4,则舍去。例如0.214保留两位小数为0.21。
    2. 如果保留位数的后一位如果是6,则进上去。例如0.216保留两位小数为0.22。
      上面这两点是和四舍五入是相同的,差别在于。
      当需要保留的位数的后一位,为5的时候,而且5后面不再有数时,则舍弃5不做进位。例如0.215保留两位小数为0.21。
      当需要保留的位数的后一位,为5的时候,而且5后面仍有数时,则进位。例如0.2153保留两位小数为0.22。

    很明显,上面这种方法,和我们小学数学老师教的方法是不同的,即使是Excel也用的不是这种方法。
    那么Python中如何实现我们传统意义上的四舍五入法呢,答案是使用decimal函数。

    from decimal import Decimal, ROUND_HALF_UP
    #Decimal后输入的是要,转换的值,这里输入值为浮点,quantize后跟得是四舍五入的位数,round=后跟得是方法
    print(Decimal(2.135).quantize(Decimal('0.00'),rounding=ROUND_HALF_UP))
    #Decimal后输入的是要,转换的值,这里输入值为字符串,quantize后跟得是四舍五入的位数,round=后跟得是方法
    print(Decimal("2.135").quantize(Decimal('0.00'),rounding=ROUND_HALF_UP))
    

    执行上面的代码后,结果如下。

    2.13
    2.14
    

    有点小意外,因为传入值类型的不同,结果也不同。不得不说,这是Decimal使用上的一个坑,必须是字符串类型,才能得到我们想要的转换值。

    经过简单改造,我们可以自制一个更简单实用的四舍五入的函数,使其不受传入值类型的限制。

    def RHU(x, rounded=2):
        from decimal import Decimal, ROUND_HALF_UP
        """
        用于传统意义的四舍五入的转换.
        :参数 x: 浮点或字符串类型的带转换值
        :参数 rounded: 四舍五入的位数,当等于0时,返回一个int型返回值
        :return: 转换后的浮点数
        """
    
        if rounded == 0:
            new_x = int(Decimal(str(x)).quantize(Decimal('0'), rounding=ROUND_HALF_UP))
        else:
            i = 0
            dec = '0.'
            while i < rounded:
                dec = dec + '0'
                i += 1
            new_x = float(Decimal(str(x)).quantize(Decimal(dec),rounding = ROUND_HALF_UP))
        return new_x
    
    
    print(RHU(2.135,2))
    print(RHU('2.135',2))
    

    执行上面的代码后,无论传入数字的类型是否是浮点数,结果都是一样的。

    相关文章

      网友评论

          本文标题:Python 实现传统意义上的四舍五入

          本文链接:https://www.haomeiwen.com/subject/lmxrkdtx.html