I have numbers in a file (so, as strings) in scientific notation, like:
8.99284722486562e-02
but I want to convert them to:
0.08992847
Is there any built-in function or any other way to do it?
I have numbers in a file (so, as strings) in scientific notation, like:
8.99284722486562e-02
but I want to convert them to:
0.08992847
Is there any built-in function or any other way to do it?
I'm pretty sure you can do this with:
float("8.99284722486562e-02")
# and now with 'rounding'
"{:.8f}".format(float("8.99284722486562e-02"))
I'm making this answer since the top voted one has misinformation and so i can explain my improvements.
TL;DR: Use ("%.17f" % n).rstrip('0').rstrip('.')
By default Python formats to scientific notation if there's 5 or more zeroes at the beginning.
0.00001
/ 1e-05
formats to "1e-05"
.
0.0001
/ 1e-04
formats to "0.0001"
.
So of course 8.99284722486562e-02
will format to "0.0899284722486562"
already.
A better example would've been 8.99284722486562e-05
. (0.00008992847224866
)
We can easily format to raw decimal places with "%f"
which is same as "%.6f"
by default.
"%f" % 8.99284722486562e-05
produces '0.000090'
.
"%f" % 0.01
produces '0.010000'
.
By default floats display upto 17 decimal places.
0.1234567898765432123
- (19 dp input)
0.12345678987654321
- (17 dp output)
So if we did "%.17f" % 8.99284722486562e-02
we'd get '0.08992847224865620'
. (note the extra 0)
But if we did "%.17f" % 0.0001
we surely wouldn't want '0.00010000000000000'
.
So to remove the trailing zeroes we can do: ("%.17f" % n).rstrip('0').rstrip('.')
(Notice we also strip the decimal point incase the number has no fraction left)
Also there's counterparts to %f
:
%f
shows standard notation
%e
shows scientific notation
%g
shows default (scientific if 5 or more zeroes)
The scientific notation can be converted to a floating point number with float
.
In [1]: float("8.99284722486562e-02")
Out [1]: 0.0899284722486562
The float
can be rounded with format
and then float
can be used on the string to return the final rounded float.
In [2]: float("{:.8f}".format(float("8.99284722486562e-02")))
Out [2]: 0.08992847
2022 edit for No Sound's comment:
I learned this solution from here (archived)
The following solutions work for larger numbers.
Solution 1)
import numpy as np
print(np.format_float_positional(1.32456e-12, trim='-'))
print(np.format_float_positional(1.32456e-24, trim='-'))
print(np.format_float_positional(1.32456e12, trim='-'))
print(np.format_float_positional(1.32456e24, trim='-'))
# Output: 0.00000000000132456
# 0.00000000000000000000000132456
# 1324560000000
# 1324560000000000000000000
Solution 2)
same as above accept this time using a lambda function
import numpy as np
pretty_print = lambda x: np.format_float_positional(x, trim="-")
print(pretty_print(1.32456e-12))
print(pretty_print(1.32456e-24))
print(pretty_print(1.32456e12))
print(pretty_print(1.32456e24))
# Output: 0.00000000000132456
# 0.00000000000000000000000132456
# 1324560000000
# 1324560000000000000000000
As you may know floating point numbers have precision problems. For example, evaluate:
>>> (0.1 + 0.1 + 0.1) == 0.3
False
Instead you may want to use the Decimal class. At the python interpreter:
>>> import decimal
>>> tmp = decimal.Decimal('8.99284722486562e-02')
Decimal('0.0899284722486562')
>>> decimal.getcontext().prec = 7
>>> decimal.getcontext().create_decimal(tmp)
Decimal('0.08992847')