python 四舍五入进位不准

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

 

 

posted on 2019-10-08 13:45  蜗牛也是妞  阅读(765)  评论(0)    收藏  举报