我执行了一个简单的规范化过程:
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:这只是我试过的一个例子。我的实际数据有很大的浮点数。我想这样做是为了避免浮点错误。我希望结果是小数而不是浮点数。
答案 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实例之间的比较将遵循参考手册的“表达式”部分中描述的不同类型对象的一般规则,从而导致混淆结果。