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

Posted

技术标签:

【中文标题】可以在 Python 中简单地将 Decimal(\'5E+1\') 转换为 Decimal(\'50\') 吗?【英文标题】:Can Decimal('5E+1') be simply converted to Decimal('50') in Python?可以在 Python 中简单地将 Decimal('5E+1') 转换为 Decimal('50') 吗? 【发布时间】:2017-10-26 14:47:41 【问题描述】:

上下文

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

今天早上我决定改用Decimal.normalize,但遇到了这个问题:

给定十进制值:

>>> value = Decimal('50.000')

规范化该值:

>>> value = value.normalize()

结果:

>>> value
Decimal('5E+1')

我理解的值是一样的:

>>> Decimal('5E+1') == Decimal('50')
True

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

问题

有没有办法将Decimal('5E+1') 转换为Decimal('50')

注意

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

【问题讨论】:

这里没有转换,这2个值与Python完全一样,所以你问如何格式化。 【参考方案1】:

出于输出格式的目的,您可以使用 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%

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

>>> 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')

【讨论】:

说真的,你读过这个问题了吗?我不想格式化输出。我正在寻找改变小数点本身。我觉得堆栈溢出已经失去了它的用处,这就是原因;甚至没有人再费心阅读这些问题了。 @orokusaki:我确实阅读了这个问题,你的问题说这样做的目的是因为5E+1 对非技术用户毫无意义。如果非技术用户看到 5E+1,那是输出格式的问题,而不是内部表示;您不应该为此更改 Decimal 对象本身。 目的是什么并不重要。重要的是我问了一个非常具体的问题,并详细说明了我需要什么。如果答案是“你不能那样做”,那很好。但是每个人都假设其他人都是白痴并且不知道他们需要什么,这就是破坏堆栈溢出的事情。这不是菜鸟问题;非常详细,非常具体。 @orokusaki:XY problem,伙计。也就是说,我已经扩展了答案。 对...这不是 XY 问题。我准确地指定了我正在尝试做的事情的上下文以及原因,在我的情况下,确切的问题是没有尾随零的小数会导致科学记数法,这使得小数对于以后的用户输出或调试...这就是问题所在。请不要将“我不知道答案”与“你问错问题”混淆了。【参考方案2】:

根据 python 3.9 文档,以下是如何做到这一点 - https://docs.python.org/3.9/library/decimal.html#decimal-faq

def remove_exponent(d):
    return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize()

【讨论】:

以上是关于可以在 Python 中简单地将 Decimal('5E+1') 转换为 Decimal('50') 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python如何取小数点位数

Python 中 decimal 模块的使用

Python 中 decimal 模块的使用

难以将str数据转换为int / float / decimal以使用matplotlib进行绘图

go使用decimal

为啥在 Python 中 Decimal('0') > 9999.0 为真?