我已经阅读了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使用科学计数法吗?
提前谢谢您
答案 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')
没有问题。