问题描述:Python中在小数精度控制是最常用便捷的是round,但round并不是简单的四舍五入,而是ROUND_HALF_EVEN的策略,导致偏离预期。
如果想要四舍五入,笔者目前发现有以下两种方式:
1. 使用decimal模块,策略更改为“ROUND_HALF_UP"(未亲自验证)
import decimal
# 修改舍入方式为四舍五入
decimal.getcontext().rounding = "ROUND_HALF_UP"
# 使用字符串来储存小数不会有精度误差,Decimal可以正确处理这种方法表示的数字
decimal.Decimal("0.645").quantize(decimal.Decimal("0.00"))
2. 自己重写函数:
def round_up(number, ndigits=None):
'''
四舍五入按位精确小数
Args:
number (float): 小数
ndigits (int > 0): 精确位数
'''
# 判断ndigits是否未正整数
if isinstance(ndigits, int) or ndigits > 0:
nd = 10 ** ndigits
f = (number * nd * 10) % 10
n = (number * nd * 10) // 10
if f < 5:
return round(n / nd, ndigits)
else:
return round((n + 1) / nd, ndigits)
else:
print('参数错误')
return
网友评论