2015-09-27 12 views
6

我有一个Python列表只充满了花车:回合飘下来了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

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

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。

+0

我更新了原文。列表中不会出现负数浮动。关于数字> 1,抱歉,我认为我不理解。你的例子中你已经有一个> 1的数字---> 1.59。您的解决方案适用于此 - 正确? –

+0

我似乎无法弄清楚数字> 1。我错过了什么吗? –

+1

是的,我在示例数据中看到了1.59。但是,例如,1059.56轮到了什么?我认为它会舍入到小数点后1位(所以1059.5)。 – reupen

0

将浮点数格式化为科学记数法可以提供帮助;然后转换回浮动类型应该实现你想要的。尝试类似:

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

谢谢。但我不确定我是否遵循。我试过'print eval(“%。0e”%(.375))',我得到了0.4。你有一个例子吗? –

+1

对于大于1的数字,这不起作用。如果你这样做了:例如:[[listval]中元素的[eval(“%。0e”%(element))],则1.59变成2.0。 – Leo

+0

你是对的;它会将数字四舍五入成为一位数字,但不会将它们四舍五入。你可以尝试像'x =“%。1e”%(.375); eval(x [:2] +“0”+ x [3:])'如果你想用同样的想法尝试。 –

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] 

如果有可能是在小数点后,你将需要添加一个简单的检查处理,没有非零值列表浮动。

+0

另一个不错的选择。非常感谢您的信息。 –