开发者

Problems with decimals and scientific notation in Python 2.6.6

开发者 https://www.devze.com 2023-02-28 12:45 出处:网络
I\'m having difficulty with decimal values that I need to use for arithmetic in some cases and as strings in others. Specifically I have a list of rates, ex:

I'm having difficulty with decimal values that I need to use for arithmetic in some cases and as strings in others. Specifically I have a list of rates, ex:

rates=[0.1,0开发者_如何学C.000001,0.0000001]

And I am using these to specify the compression rates for images. I need to initially have these values as numbers because I need to be able to sort them to make sure they are in a specific order. I also want to be able to convert each of these values to strings so I can 1) embed the rate into the filename and 2) log the rates and other details in a CSV file. The first problem is that any float with more than 6 decimal places is in scientific format when converted to a string:

>>> str(0.0000001)
'1e-07'

So I tried using Python's Decimal module but it is also converting some floats to scientific notation (seemingly contrary to the docs I've read). Ex:

>>> Decimal('1.0000001')
Decimal('1.0000001')
# So far so good, it doesn't convert to scientific notation with 7 decimal places
>>> Decimal('0.0000001')
Decimal('1E-7')
# Scientific notation, back where I started.

I've also looking into string formatting as suggested in multiple posts, but I've not had any luck. Any suggestions and pointers are appreciated by this Python neophyte.


You have to specify the string format then:

["%.8f" % (x) for x in rates]

This yields ['0.10000000', '0.00000100', '0.00000010']. Works with Decimal, too.


'{0:f}'.format(Decimal('0.0000001'))

The above should work for you


See % formatting, especially the floating point conversions:

'e' Floating point exponential format (lowercase). (3)

'E' Floating point exponential format (uppercase). (3)

'f' Floating point decimal format. (3)

'F' Floating point decimal format. (3)

'g' Floating point format. Uses lowercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise. (4)

'G' Floating point format. Uses uppercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise. (4)

An example, using f format.

>>> ["%10.7f" %i for i in rates]
[' 0.1000000', ' 0.0000010', ' 0.0000001']
>>> 

You can also use the newer (starting 2.6) str.format() method:

>>> ['{0:10.7f}'.format(i) for i in rates]
[' 0.1000000', ' 0.0000010', ' 0.0000001']
>>> 


Using f-strings:

>>> rates = [0.1, 0.000001, 0.0000008]
>>> [f'{r:.7f}' for r in rates]
['0.1000000', '0.0000010', '0.0000008']

The string format {r:.7f} indicates the number of digits used after the decimal point, which in this case is 7.

0

精彩评论

暂无评论...
验证码 换一张
取 消