可以在 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') 吗?的主要内容,如果未能解决你的问题,请参考以下文章