python 3-用负数位舍入小数将导致科学计数形式的小数

时间:2018-09-04 16:15:22

标签: python python-3.x

在将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')

我不认为这会归类为错误,因为仅会影响符号而不是实际值,但这对我来说还是很奇怪。

有人知道我为什么看到这种行为吗?您知道它是故意的还是小错误?

1 个答案:

答案 0 :(得分:4)

这是正常现象,是故意的。 Decimal跟踪有效数字,十进制repr用于保留有效数字。 Decimal('3.3E+3')有两个有效数字,而Decimal('3300')有四个有效数字。