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

2023-02-11  本文已影响0人  welder77

其实要让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))

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

上一篇下一篇

猜你喜欢

热点阅读