Python 有没有办法确保十进制(';0)乘以某个值实际返回0?
使用python 3.4.3或python 3.5.1,我惊讶地发现: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的“置信度”。你得到的仍然
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')