使用python 3.4.3或python 3.5.1我很惊讶地看到:
from decimal import Decimal
Decimal('0') * Decimal('123.456789123456')
返回:
Decimal('0E-12')
更糟糕的是,这个特定用例适用于float。
我能做些什么来确保数学运算并且0乘以任何值返回0?
答案 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')