有没有办法确保Decimal(' 0)次返回实际为0?

时间:2016-12-06 22:31:44

标签: python python-3.x decimal

使用python 3.4.3或python 3.5.1我很惊讶地看到:

from decimal import Decimal
Decimal('0') * Decimal('123.456789123456')

返回:

Decimal('0E-12')

更糟糕的是,这个特定用例适用于float。

我能做些什么来确保数学运算并且0乘以任何值返回0?

4 个答案:

答案 0 :(得分:5)

0E-12实际上是0(它是0 * 10 ** -12的缩写;因为系数是0,那仍然是0),Decimal只提供E-12位表示0的“置信度”。你得到的东西仍然会表现为零(它是假的,附加的身份等),唯一的怪癖就是如何印刷。

如果您需要格式匹配,可以使用格式化迷你语言,或者您可以在结果上调用.normalize(),这会将Decimal('0E-12')变为Decimal('0')(该方法的用途)是从结果中去掉尾随零,以产生一个最小的规范形式,以相同的方式表示所有相同的数字。)

答案 1 :(得分:0)

尽管Decimal('0E-12')在视觉上与Decimal('0')不同,但与python没有区别。

>>> Decimal('0E-12') == 0
True

符号0E-12实际上代表:0 * 10 ** -12。此表达式的计算结果为0.

答案 2 :(得分:0)

您可以将结果量化为所需的精度。

from decimal import Decimal, ROUND_HALF_UP
result = Decimal('0') * Decimal('123.456789123456')
result.quantize(Decimal('.01'), rounding = ROUND_HALF_UP)

>>>Decimal('0.00')

有关更多信息(例如关于舍入模式或甚至为所有小数设置上下文),请参阅https://docs.python.org/3/library/decimal.html

编辑:我猜你最好的打击是使用ShadowRanger提到的result.normalize()方法。

答案 3 :(得分:-3)

使用浮点数进行乘法,然后转换为小数。

x = 0
y = 123.456789123456
Decimal(x*y)

返回(在Python 3.5.2上):

Decimal('0')