在Python中,Decimal('5E+1')可以简单地转换为Decimal('50')吗?

oro*_*aki 2 python scientific-notation decimal exponent python-2.7

语境

我们在应用程序中向代理显示不带尾随零的百分比值(50%比现在更容易快速扫描50.000%),到目前为止,我们只是使用quantize强力标准化该值以删除尾随零。

今天早上我决定考虑使用它Decimal.normalize,但遇到了这个:

给定十进制值:

>>> value = Decimal('50.000')
Run Code Online (Sandbox Code Playgroud)

标准化该值:

>>> value = value.normalize()
Run Code Online (Sandbox Code Playgroud)

结果是:

>>> value
Decimal('5E+1')
Run Code Online (Sandbox Code Playgroud)

我理解值是相同的:

>>> Decimal('5E+1') == Decimal('50')
True
Run Code Online (Sandbox Code Playgroud)

但从非技术用户的角度来看,5E+1基本上是没有意义的。

问题

有办法转换Decimal('5E+1')Decimal('50')吗?

笔记

我不想做任何会改变 的值的事情Decimal(例如,完全删除小数位),因为该值可能是例如Decimal('33.333'). IOW,不要将我的50.000示例混淆为我们只处理整数。

use*_*ica 8

出于输出格式化的目的,您可以使用f格式说明符打印规范化的 Decimal 对象。(虽然格式字符串文档说默认精度为 6,但 Decimal 对象的情况似乎并非如此。)

>>> print('{:f}%'.format(decimal.Decimal('50.000').normalize()))
50%
>>> print('{:f}%'.format(decimal.Decimal('50.003').normalize()))
50.003%
>>> print('{:f}%'.format(decimal.Decimal('1.23456789').normalize()))
1.23456789%
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因,您确实想创建一个具有不同精度的新 Decimal 对象,您可以通过调用格式输出来做到这一点Decimalf但听起来您正在处理输出格式问题,而不是您应该更改的内容的内部表示。

>>> Decimal('{:f}'.format(Decimal('5E+1')))
Decimal('50')
>>> 
>>> Decimal('{:f}'.format(Decimal('50.000').normalize()))
Decimal('50')
>>> Decimal('{:f}'.format(Decimal('50.003').normalize()))
Decimal('50.003')
>>> Decimal('{:f}'.format(Decimal('1.23456789').normalize()))
Decimal('1.23456789')
Run Code Online (Sandbox Code Playgroud)

  • @orokusaki:我确实读过这个问题,你的问题说这样做的目的是因为“5E+1”对于非技术用户来说毫无意义。如果非技术用户*看到*“5E+1”,那么这是输出格式的问题,而不是内部表示的问题;您不应该为此更改 Decimal 对象本身。 (3认同)