打印十进制数,不带DECIMAL字,也不进行浮点转换

时间:2015-11-26 13:25:39

标签: python python-2.7 decimal

我执行了一个简单的规范化过程:

a = range(5)
norm = [Decimal(i)/sum(a) for i in a]
print norm

输出:

[Decimal('0'), Decimal('0.1'), Decimal('0.2'), Decimal('0.3'), Decimal('0.4')]

但我只想打印:

[0, 0.1, 0.2, 0.3, 0.4]

我该如何纠正这个问题?请帮忙。

PS:这只是我试过的一个例子。我的实际数据有很大的浮点数。我想这样做是为了避免浮点错误。我希望结果是小数而不是浮点数。

2 个答案:

答案 0 :(得分:1)

使用print(str(十进制))代替print(十进制):

print [str(i) for i in norm]
['0', '0.1', '0.2', '0.3', '0.4']

答案 1 :(得分:1)

打印小数而没有'十进制'出现时,您可以继承Decimal并覆盖__repr__

>>> class MyDecimal(Decimal):
...   def __repr__(self):
...     return str(float(self))
...
>>> x = Decimal(4.1)
>>> x
Decimal('4.0999999999999996447286321199499070644378662109375')
>>> y = MyDecimal(5.3)
>>> y
5.3

但是,当您对它们进行任何操作时,repr会回到原来的形式:

>>> y = MyDecimal(5.3)
>>> z = MyDecimal(4.2)
>>> y + z
Decimal('9.500000000000000000000000000')

要在这种情况下始终获得MyDecimal,您需要覆盖所有Decimal的操作,以返回MyDecimal项目,而不是Decimal

请注意,我们在这里看到的是小数的表示。在进行其他操作时,您需要保留原样。或者在其他地方使用时始终转换为浮动。 From the docs

  

在算术运算中,十进制对象通常不能与浮点数组合:例如,尝试将一个Decimal添加到浮点数会引发TypeError。这个规则有一个例外:可以使用Python的比较运算符来比较float实例x和Decimal实例y。如果没有此异常,Decimal和float实例之间的比较将遵循参考手册的“表达式”部分中描述的不同类型对象的一般规则,从而导致混淆结果。