我理解指数的值,但通常在向最终用户显示十进制值时,外行人更容易理解正常的十进制值。当我执行以下操作时,我宁愿将小数的显示值设为50
,而不是:
>>> Decimal('22679.6185') / Decimal('28.349523125') / 16
Decimal('5E+1')
这是否可以在不进行量化或做任何修改实际值的情况下进行?另外,为什么它显示像这样的短值作为指数和一些较长的正常小数形式的值?这是分裂的产物(具有讽刺意味)吗?
答案 0 :(得分:2)
您正在看到默认表示形式,您可以通过继承Decimal
并覆盖__str__
和/或__repr__
来更改默认表示形式。
请注意,__repr__
的实现方式与return "Decimal('%s')" % str(self)
类似,但您应该尝试保留eval(repr(d)) == d
的不变量。
您可能更感兴趣的不是修改默认的str输出或类的表示,而只是控制实例的显示格式。在这种情况下,您应该只能使用str.format
功能,例如
>>> num = Decimal('5E+1')
>>> num
Decimal('5E+1')
>>> print("{:f}".format(num))
50
答案 1 :(得分:1)
请参阅:Significant figures in the decimal module(诚然告诉您使用.quantize())。主要问题是您必须手动跟踪有效位数。
答案 2 :(得分:0)
直接将Decimal解析为int或float。
int(decimal.Decimal('22679.6185') / decimal.Decimal('28.349523125') / 16)
或
float(decimal.Decimal('22679.6185') / decimal.Decimal('28.349523125') / 16)
22679.6185 / 28.349523125正好等于800.它显示十进制(“8E2”)没有任何错误。
精度取决于上下文对象。使用“decimal.getcontext()”检查它。它看起来如下:
Context(prec=28, rounding=ROUND_HALF_EVEN, ....)
“prec”就是你想要的。试试这个。
decimal.Decimal("42.5") / decimal.Decimal("37.1")
它产生了28个有效数字。