Round在Python中向下浮动以仅保留一个非零小数

时间:2015-09-27 19:59:41

标签: python list python-2.7 rounding

我有一个仅填充浮点数的Python列表:

list_num = [0.41, 0.093, 0.002, 1.59, 0.0079, 0.080, 0.375]

我需要将此列表四舍五入以获得:

list_num_rounded = [0.4, 0.09, 0.002, 1.5, 0.007, 0.08, 0.3]

问题: 1.59到1.5的舍入很容易。但是,我的问题是浮点数小于1。

问题: 基本上,我需要将所有浮子向下舍入,以便:如果浮子是< 1,然后圆形版本只包含一个非零数字。有没有办法在Python 2.7中执行此操作?

编辑:

尝试: 这是我尝试过的:

list_num_rounded = []
for elem in list_num:
    if elem > 0.01 and elem < 0.1:
        list_num_rounded.append(round(elem,2))
    if elem > 0.001 and elem < 0.01:
        list_num_rounded.append(round(elem,3))
    elif elem > 0.1:
        list_num_rounded.append(round(elem,1))

然而,这给出了:

[0.4, 0.09, 0.002, 1.6, 0.008, 0.08, 0.4]

它向上舍入1.59,0.79和0.375,但我需要一种只能向下舍入的方法。有没有办法做到这一点?

编辑2:

该列表不包含负浮动。只有正浮标才会出现。

4 个答案:

答案 0 :(得分:4)

您可以使用对数来计算出有多少前导零,然后您需要一种向下舍入的方法。一种方法是像这样使用地板:

import math

list_num = [0.41, 0.093, 0.002, 1.59, 0.0079, 0.080, 0.375, 0, 10.1, -0.061]


def myround(n):
    if n == 0:
        return 0
    sgn = -1 if n < 0 else 1
    scale = int(-math.floor(math.log10(abs(n))))
    if scale <= 0:
        scale = 1
    factor = 10**scale
    return sgn*math.floor(abs(n)*factor)/factor


print [myround(x) for x in list_num]

输出:

[0.4, 0.09, 0.002, 1.5, 0.007, 0.08, 0.3]

我不确定您希望如何处理负数和大于1的数字,这会使负数增加并且数字大于1到1dp。

答案 1 :(得分:3)

鉴于所有浮点数都是正数,你可以将它们转换为字符串并使用这样的切片。

def round(num):
    working = str(num-int(num))
    for i, e in enumerate(working[2:]):
        if e != '0':
            return int(num) + float(working[:i+3])

list_num = [0.41, 0.093, 0.002, 1.59, 0.0079, 0.080, 0.375]
new_list = [round(x) for x in list_num]
print new_list

打印

[0.4, 0.09, 0.002, 1.5, 0.007, 0.08, 0.3]

如果列表中的浮点数在小数点后没有非零值,则需要添加一个简单的检查来处理。

答案 2 :(得分:1)

将浮点数格式化为科学计数法可能会有所帮助;然后转换回float类型应该达到你想要的。尝试类似:

eval("%.0e" % (.03))
eval("%.0e" % (.034))
eval("%.0e" % (.0034))

答案 3 :(得分:0)

def round_float(num):
    if not num:
        return num
    current_num = abs(num) * 10
    round_value = 1

    while not (current_num//1):
        current_num *= 10
        round_value +=1

    return round(num, round_value)