Problems with decimals and scientific notation in Python 2.6.6

你说的曾经没有我的故事 提交于 2019-12-10 11:24:30

问题


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.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.


回答1:


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.




回答2:


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

The above should work for you




回答3:


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']
>>> 


来源:https://stackoverflow.com/questions/5785996/problems-with-decimals-and-scientific-notation-in-python-2-6-6

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!