使用包含十进制数据类型的数据库时如何避免科学记数法

Posted

技术标签:

【中文标题】使用包含十进制数据类型的数据库时如何避免科学记数法【英文标题】:How to avoid scientific notation when using databases containing decimal datatype 【发布时间】:2018-03-08 21:00:32 【问题描述】:

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

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】:

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

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

【讨论】:

这可行,但遗憾的是我也有不同的数据类型,例如同一个字典中的字符串,这会阻止这解决我的问题。谢谢

以上是关于使用包含十进制数据类型的数据库时如何避免科学记数法的主要内容,如果未能解决你的问题,请参考以下文章

数据类型

Java double 避免科学记数法但保留数据类型

excel中如何避免科学记数法转换

使用php和pear写入excel时如何避免大数的科学记数法

Day02-进制与基本数据类型介绍

Java中double类型如何避免显示为科学计数法