在将round()
函数与舍入因子为负数(参数ndigits
)和decimal
模块一起使用时,我注意到一种奇怪的行为。
我正在使用Python 3
(特别是3.6.3
,但我不知道特定的次要版本是否适合这种情况)。
使用float
看起来很正常:
>>> round(10000 / 3, 2)
3333.33
>>> round(10000 / 3, 1)
3333.3
>>> round(10000 / 3, 0)
3333.0
>>> round(10000 / 3, -1)
3330.0
>>> round(10000 / 3, -2)
3300.0
对于Decimal
,结果是正确的,但是当使用负四舍五入因子时,它将变为科学计数法:
>>> from decimal import Decimal
>>> round(Decimal('10000') / 3, 2)
Decimal('3333.33')
>>> round(Decimal('10000') / 3, 1)
Decimal('3333.3')
>>> round(Decimal('10000') / 3, 0)
Decimal('3333')
>>> round(Decimal('10000') / 3, -1)
Decimal('3.33E+3')
>>> round(Decimal('10000') / 3, -2)
Decimal('3.3E+3')
我的快速解决方案是将0
添加到结果中,从而将表示法恢复为“正常”(非科学):
>>> round(Decimal('10000') / 3, -1) + 0
Decimal('3330')
>>> round(Decimal('10000') / 3, -2) + 0
Decimal('3300')
我不认为这会归类为错误,因为仅会影响符号而不是实际值,但这对我来说还是很奇怪。
有人知道我为什么看到这种行为吗?您知道它是故意的还是小错误?
答案 0 :(得分:4)
这是正常现象,是故意的。 Decimal
跟踪有效数字,十进制repr
用于保留有效数字。 Decimal('3.3E+3')
有两个有效数字,而Decimal('3300')
有四个有效数字。