用Python将小数对象转换为科学计数法

时间:2018-07-01 19:10:41

标签: python floating-point decimal string-formatting precision

我已经阅读了Decimal文档并研究了其他方法来抑制Python中的科学记数表达式,但是我遇到Decimal包无法按预期工作的问题,而且我无法弄清楚如何获得所需的输出

我有一个字符串-my_tick = "0.0000005"

type(my_tick)
<class 'str'>

当我将其传递给Decimal()时,该对象将被格式化并以科学计数法返回:

from decimal import *

formatted_tick = Decimal(my_tick)
print(formatted_tick)
5E-7

如果我致电getcontext(),我会发现我的默认精度设置为28位小数:

getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[InvalidOperation, FloatOperation], traps=[InvalidOperation, DivisionByZero, Overflow])

我尝试将字符串包装为浮点型,但仍以科学计数法返回:

formatted_tick = Decimal(repr(float(my_tick)))
print(formatted_tick)
5E-7

这两个结果都导致一个Decimal对象,其值为5E-7

对于我的函数,它必须保留为0.0000005值的十进制对象,就格式而言,其他数字可能会出现相同的问题,并且我不一定提前知道精度,因此需要一种本身可以处理1到10个小数位精度的本地解决方案。有人知道精度设置为28时,为什么Decimal使用科学计数法吗?

提前谢谢您

1 个答案:

答案 0 :(得分:1)

如果str.format指定使用float输出为:f的格式,则数字将按照您希望的方式格式化:

>>> "{:f}".format(decimal.Decimal("0.0000000005"))
"0.0000000005"

如果您希望将此行为作为十进制的默认字符串表示行为,则可以定义这样的类:

 class NoScientificNotation(decimal.Decimal):
     def __str__(self):
         return "{:f}".format(self)

然后将其像`Decimal:

一样使用
>>> NoScientificNotation("0.0000000005")
Decimal('0.0000000005')

没有问题。