When using Decimal(0) and formatting it to .2e format the following happens:
>>> f'{Decimal(0):.2E}'
'0.00E+2'
However if you just use 0 or 0. the following happens:
>>> f'{0.:.2E}'
'0.00E+00'
How come the results are different?
To format floats without trailing zeros with Python, we can use the rstrip method. We interpolate x into a string and then call rstrip with 0 and '. ' to remove trailing zeroes from the number strings. Therefore, n is 3.14.
Use the format() function to add zeros to a float after the decimal, e.g. result = format(my_float, '. 3f') . The function will format the number with exactly N digits following the decimal point. Copied!
To format decimals, we will use str. format(number) where a string is '{0:. 3g}' and it will format string with a number. Also, it will display the number with 1 number before the decimal and up to 2 numbers after the decimal.
In my previous answer I described how this is done in cpython, in this I will describe why. This question was raised in this discussion and most of the quotes will be from there:
Let's consider an example:
>>> x = Decimal("1e+5").quantize(Decimal("1e+10"))
>>> x
Decimal('0E+10')
>>> s = "{:.19e}".format(x)
>>> s
'0.0000000000000000000e+29'
>>> Decimal(s)
Decimal('0E+10')
The original magnitude was e+10, after formatting it's still e+10.
The magnitude of the original number is kept after the formatting process.
From the point of view of decimal it's the right thing. The original magnitude should be traceable
0is really special in the IBM specification. The magnitude is kept, the precision is not.>>> Decimal("0e10") * Decimal("0e20") Decimal('0E+30') >>> Decimal("0.000e10") Decimal('0E+7')So we're basically doing the reverse of the above in formatting when a precision is given.
So, if we go back to the original example of the OP:
>>> f'{Decimal(0):.2E}'
'0.00E+2'
If it returned 0.00Е+00 then the magnitude of this decimal number would be E-2:
>>> d = f'{Decimal(0):.2E}'
>>> d
'0.00E+2'
>>> Decimal(d)
Decimal('0')
>>> d = '0.00E+00'
>>> Decimal(d)
Decimal('0.00')
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