使用包含十进制数据类型

时间:2018-03-08 21:00:32

标签: python decimal scientific-notation

我有一个包含大量十进制数据类型的大字典。其中许多值非常小,打印时以科学记数法显示。 如何在不单独打印每个数据的情况下将字典打印为普通小数?感谢

from decimal import Decimal 

dic = {'value1': Decimal('0.000000123'), 'value2' : Decimal('0.00000001'),
       'value3' : Decimal('0.00000000000001')}

# This happens which I don't want: 
print(dic)
>> {'value1': Decimal('1.23E-7'), 'value2': Decimal('1E-8'), 
    'value3': Decimal('1E-14')}

# I want: 
print(dic)
>> {'value1': Decimal('0.000000123'), 'value2' : Decimal('0.00000001'), 
    'value3' : Decimal('0.00000000000001')}

我不能单独使用{0:.8f} .format(val)或类似的东西,因为有数以千计的项目,那么如何在没有科学记数法的情况下获取值?也许在创建小数?感谢

编辑:字典中还有其他数据类型,例如字符串,因此解决方案不会受此影响。

1 个答案:

答案 0 :(得分:2)

如果它真的只是为了看你的价值观,那么你可以这样做:

import numbers

# Include isinstance() to check that your value is numeric
print(['{}: {:.14f}'.format(k,i) for k,i in dic.items() 
        if isinstance(i, numbers.Number)])

返回:

['value1: 0.00000012300000', 'value2: 0.00000001000000', 'value3: 0.00000000000001']

或者,如果您仍想打印非数字值(仅未格式化),请使用:

print(['{}: {:.14f}'.format(k,i) if isinstance(i, numbers.Number) 
        else '{}: {}'.format(k,i) for k,i in dic.items()])

示例:

dic = {'value1': Decimal('0.000000123'), 'value2' : Decimal('0.00000001'),
       'value3' : Decimal('0.00000000000001'), 'value4': 'string'}

print(['{}: {:.14f}'.format(k,i) if isinstance(i, numbers.Number) 
        else '{}: {}'.format(k,i) for k,i in dic.items()])

返回:

['value1: 0.00000012300000', 'value2: 0.00000001000000', 'value3: 0.00000000000001', 'value4: string']

但正如您所指出的,这仅适用于查看您的值,因为它们会以键和值的组合形式返回。

注意: 我使用了{:.14f},因为您的最小小数位数为E-14