Python 有没有办法确保十进制(';0)乘以某个值实际返回0?

Python 有没有办法确保十进制(';0)乘以某个值实际返回0?,python,python-3.x,decimal,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 0E-12实际上是0(它是0*10**-12的缩写;因为系数是0,所以仍然是0),Decimal只提供E-12位来表示0的“置信度”。你得到的仍然

使用python 3.4.3或python 3.5.1,我惊讶地发现:

from decimal import Decimal
Decimal('0') * Decimal('123.456789123456')
返回:

Decimal('0E-12')
更糟糕的是,这个特定用例与float一起工作


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

0E-12
实际上是
0
(它是
0*10**-12
的缩写;因为系数是0,所以仍然是0),
Decimal
只提供
E-12
位来表示
0
的“置信度”。你得到的仍然是零(它是虚假的,加性的身份,等等),唯一的怪癖是它如何打印


如果需要匹配格式,可以使用格式迷你语言,也可以对结果调用
.normalize()
,这将
十进制('0E-12')
转换为
十进制('0')
(该方法的目的是从结果中去掉尾随的零,以产生一个最小的标准形式,以相同的方式表示所有相等的数字)。

使用浮点数进行乘法,然后转换为十进制

x = 0
y = 123.456789123456
Decimal(x*y)
返回(在Python 3.5.2上):

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

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

符号0E-12实际上表示:0*10**-12。此表达式的计算结果为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')
有关更多信息(例如关于舍入模式,甚至设置所有小数的上下文),请参阅


编辑:我想你的最佳选择是使用ShadowRanger提到的
result.normalize()
方法。

从技术上讲,这是0。你打算如何使用结果?这个数字太小了,基本上是0,正如@Nicarus所说。你能舍入到小数点后几位吗?
decimal('0E-12')==decimal('0'))
给出了
True
,而
Decimal('1E-12')==Decimal('0')
给出了
False
。所以我认为
Decimal('0E-12')
不是大约0,在Python中是0。
0E-12
的意思是
0*10^(-12)
,这是
0
的主题,但3.5.2已经推出一段时间了……)这完全违背了一开始就使用
Decimal
的观点。愚蠢的我。。。0E-12实际上是0。如果我需要在某处显示结果,感谢您的回答和指向.normalize()的指针。
from decimal import Decimal, ROUND_HALF_UP
result = Decimal('0') * Decimal('123.456789123456')
result.quantize(Decimal('.01'), rounding = ROUND_HALF_UP)

>>>Decimal('0.00')