I noticed a strange behaviour when using the round() function with a negative rounding factor (the parameter ndigits) and with the decimal module.
I'm using Python 3 (specifically 3.6.3, but I don't know if the specific minor version matters for this case).
With float it looks normal:
>>> 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
With Decimal the result is correct, but it changes to scientific notation when using a negative rounding factor:
>>> 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')
My quick fix was to add 0 to the result, which restores the notation back to "normal" (non-scientific):
>>> round(Decimal('10000') / 3, -1) + 0
Decimal('3330')
>>> round(Decimal('10000') / 3, -2) + 0
Decimal('3300')
I don't think this classifies as a bug, because only the notation and not the actual value is affected, but it is strange to me nonetheless.
Does anyone have an idea why I am seeing this behaviour? Do you know if it is intended or a minor bug?
This is normal and intended. Decimal tracks significant digits, and the Decimal repr is intended to preserve significant digits. Decimal('3.3E+3') has two significant digits, while Decimal('3300') has four.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With