问题描述
问题解决
def new_round(_float, _len):
"""
判断需要保留位数后的一位是不是5,如果是5,变成6,在使用round进行四舍五入
:param _float:
:param _len:
:return:
"""
if isinstance(_float, float) or isinstance(_float, np.float):
# 小数位数小于保留长度, 直接返回
if str(_float)[::-1].find('.') <= _len:
return _float
if str(_float).split('.')[1][_len] == '5':
_float = float(str(_float).split('.')[0] + '.' + str(_float).split('.')[1][:_len]+'6')
elif isinstance(_float, pd.Series):
_float = _float.apply(lambda x: float(str(x).split('.')[0] + '.' + str(x).split('.')[1][:_len]+'6') \
if len(str(x).split('.'))==2 and len(str(x).split('.')[1])>_len and str(x).split('.')[1][_len] == '5' \
else x)
return round(_float, _len)
def new_round(_float, _len):
"""
通过Decimal模板进行精确度处理四舍五入
传入Decimal参数必须是字符串,才能生效
:param _float:
:param _len:
:return:
"""
_len_str = '0.' + '0' * _len
if isinstance(_float, float) or isinstance(_float, np.float):
_float = float(Decimal(str(_float)).quantize(Decimal(_len_str), rounding=ROUND_HALF_UP))
elif isinstance(_float, pd.Series):
_float = _float.apply(lambda x: float(Decimal(str(x)).quantize(Decimal(_len_str), rounding=ROUND_HALF_UP)))
return _float