【发布时间】:2021-09-14 21:19:56
【问题描述】:
所以我正在尝试创建一个以最易读的格式返回字符串化十进制的函数。这些是我为自己创建的要求:
- 如果数字的绝对指数大于等于9,则应使用科学计数法表示(例如
25000000000 -> 2.5E+9、0.0000000036 -> 3.6E-9) - 否则,该数字应以标准表示法十进制表示,并带有最少的尾随零(例如
103.400000 -> 103.4、0.000005600 -> 0.0000056)
目前,我正在使用从 this answer 修改的一些代码,但我真的找不到一种方法来让它完全符合我的要求。
目前,我的解决方案如下:
def stringifyDecimal(d: Decimal):
# If d is within a reasonable range for printing as a normal number
a = abs(math.log10(abs(d)))
if a < 9:
r = d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize()
else:
r = d.normalize()
return str(r)
这适用于较大的数字:
stringifyDecimal(D('1E5')) -> '10000'stringifyDecimal(D('1E9')) -> '1E+9'
但是对于非常小的分数,它总是以科学计数法返回:
stringifyDecimal(D('1E-7')) -> '1E-7'
这是因为第 5 行的 ...else d.normalize() 部分返回一个 Decimal,默认情况下将字符串化为科学记数法。遗憾的是,格式化选项不适用于 they require me to know the exact precision that I want to format to。
有没有一种方法可以强制 Decimal 类型以小数而不是科学计数法显示非常小的分数?
【问题讨论】:
-
得到a的值后可以做一些打印调试。并检查它
1E-7 -
那么,你的下限是多少?大概你不希望
23E-23完全显示出来。 -
@xcodz-dot 我已经这样做了,它按预期工作。
-
@TimRoberts 我的下限也是 9。
1E-8应该打印为十进制,但1E-9应该用科学计数法打印。 -
那么问题出在 if 块内
标签: python decimal string-formatting