其实要让Python实现传统意义上的四舍五入法,并没有之前想象的那么简单。
原因就在于Python默认提供的解决方案,使用的是round函数,而round函数实现的是奇进偶舍法,又称为四舍六入五成双规则、银行进位法。
这种方法的特点如下:
- 要求保留位数的后一位如果是4,则舍去。例如0.214保留两位小数为0.21。
- 如果保留位数的后一位如果是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))
执行上面的代码后,无论传入数字的类型是否是浮点数,结果都是一样的。