python中四舍五入进位不准,自己写了个方法结果:
def new_round(_float, _len): ''' 四舍五入保留小数位,如果想实现 0.2 显示为 0.20,可使用 '%.2f' % num 实现 :param _float: :param _len: 保留的小数位 :return: ''' _float=float(_float) if len(str(_float).split('.')[1])<= _len: return round(_float, _len) elif str(_float)[-1] == '5': return round(float(str(_float)[:-1] + '6'), _len) else: return round(_float, _len) print('-0.1535' , '=', new_round(-0.15355, 2)) print('-0.2500', '=', new_round(-0.2500, 2)) print('0.453', '=', new_round(0.453, 2)) print('0.5500', '=', new_round(0.5500, 2)) # 如果想实现 0.2 显示为 0.20,可使用 '%.2f' % num 实现 print('291.818500', '=', '%.5f' % new_round(291.818500, 5))
输出:
-0.1535 = -0.15
-0.2500 = -0.25
0.453 = 0.45
0.5500 = 0.55
291.818500 = 291.81850
# 处理科学计算法记录的数据 如:1.23333e-5
import math
n = 10
demical_num = 7 #需要保留的小数位数
data_value = 0.0001/3 #需要保留的小数
print(data_value) # 输出3.3333333333333335e-05
decimal_digit = '%.'+str(demical_num)+'f'
for i in range(demical_num+1):
n = n*10
if float(data_value) < 0:
data_value1 = math.ceil(float(data_value) * n)
else:
data_value1 = math.floor(float(data_value) * n)
data_value2 = data_value1/n
decimal_data = decimal_digit % new_round(float(data_value2), demical_num)
print(decimal_data) # 输出 0.0000033
def getDecimal(data_value, demical_num=2, divided_num=100000000, isdivided=True, none_zero='0.00'): ''' 除以10000000,并处理小数点 data_value:需要进行判断是否是-0.00的数据 :param data_value: 需要处理的小数 :param demical_num: 保留的小数位 :param divided_num: 被除数 :param isdivided: 是否除以 divided_num :param none_zero: 非数字返回的值 :return: ''' def isNumber(num): ''' 判断是否为数字 :param num: :return: ''' pattern = re.compile(r'^[-+]?[-0-9]d*.d*|[-+]?.?[0-9]d*$') result = pattern.match(str(num)) if result: return True else: return False def dealNum(data_value, demical_num, isdivided, divided_num): ''' 除以数据,处理科学计算法记录的数据 如:1.2e-5 :param demical_num: 需要处理的小数 :param demical_num: 保留的小数位 :param isdivided: 是否除以 divided_num :param divided_num: 被除数 :return: ''' import math n = 10 for i in range(demical_num + 1): n = n * 10 if float(data_value) < 0: if isdivided: data_temp = math.ceil(float(data_value) / divided_num * n) else: data_temp = math.ceil(float(data_value) * n) else: if isdivided: data_temp = math.floor(float(data_value) / divided_num * n) else: data_temp = math.floor(float(data_value) * n) data_value = data_temp / n def newRound(_float, _len): ''' 四舍五入保留小数位,如果想实现 0.2 显示为 0.20,可使用 '%.2f' % num 实现 :param _float: :param _len: 保留的小数位 ''' if len(str(_float).split('.')[1]) <= _len: return round(_float, _len) elif str(_float)[-1] == '5': return round(float(str(_float)[:-1] + '6'), _len) else: return round(_float, _len) if not isNumber(str(data_value)): return str(none_zero) decimal_digit = '%.' + str(demical_num) + 'f' data_value = dealNum(data_value, demical_num, isdivided, divided_num) # 调用new_round()进行四舍五入 decimal_data = decimal_digit % newRound(float(data_value), demical_num) data = str(none_zero) if decimal_data == '-0.00' or decimal_data == '0.00' else decimal_data return data