Python 2.6.6中的小数和科学计数法问题
我在处理小数值时遇到了一些困难,这些小数值有时候需要用来做数学运算,有时候又需要作为字符串使用。具体来说,我有一组费率,比如:
rates=[0.1,0.000001,0.0000001]
我用这些费率来指定图片的压缩率。最开始我需要把这些值当作数字,因为我需要对它们进行排序,以确保它们按照特定的顺序排列。同时,我还想把这些值转换成字符串,这样我可以 1) 把费率嵌入到文件名中,2) 在一个CSV文件中记录费率和其他细节。第一个问题是,任何小数点后超过6位的浮点数在转换成字符串时都会变成科学计数法:
>>> str(0.0000001)
'1e-07'
所以我尝试使用Python的Decimal模块,但它在转换某些浮点数时也会变成科学计数法(这似乎和我读过的文档不太一致)。例如:
>>> 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.
我还查看了很多帖子中提到的字符串格式化,但一直没有成功。作为一个Python新手,任何建议和指点都非常感谢。
4 个回答
4
查看 % 格式化
,特别是浮点数转换:
'e' 浮点数的科学计数法格式(小写)。 (3)
'E' 浮点数的科学计数法格式(大写)。 (3)
'f' 浮点数的十进制格式。 (3)
'F' 浮点数的十进制格式。 (3)
'g' 浮点数格式。如果指数小于 -4 或者不小于精度,就使用小写的科学计数法格式,否则使用十进制格式。 (4)
'G' 浮点数格式。如果指数小于 -4 或者不小于精度,就使用大写的科学计数法格式,否则使用十进制格式。 (4)
下面是一个使用 f
格式的例子。
>>> ["%10.7f" %i for i in rates]
[' 0.1000000', ' 0.0000010', ' 0.0000001']
>>>
你还可以使用更新的(从 2.6 开始) str.format()
方法:
>>> ['{0:10.7f}'.format(i) for i in rates]
[' 0.1000000', ' 0.0000010', ' 0.0000001']
>>>
5
'{0:f}'.format(Decimal('0.0000001'))
上面的内容应该对你有帮助。
5
你需要先指定字符串的格式:
["%.8f" % (x) for x in rates]
这样会得到 ['0.10000000', '0.00000100', '0.00000010']
。这也适用于 Decimal
类型。