我想打印一些浮点数,这样它们总是以十进制形式(例如,12345000000000000000000.0
或 0.000000000000012345
,而不是 科学记数法,然而我想要的结果是最多15.7 重要数字的 IEEE 754双精度,而不是更多。
我想要的是 理想情况下 < em > ,这样的结果是位置十进制格式的 < em > 最短 字符串,当转换为 float
时仍然会得到相同的值。
众所周知,如果指数大于15或小于 -4,则 float
的 repr
是用科学记数法写的:
>>> n = 0.000000054321654321
>>> n
5.4321654321e-08 # scientific notation
如果使用 str
,得到的字符串也是科学记数法:
>>> str(n)
'5.4321654321e-08'
有人建议,我可以使用带有 f
标志和足够精确度的 format
来消除科学记数法:
>>> format(0.00000005, '.20f')
'0.00000005000000000000'
它适用于这个数字,虽然它有一些额外的尾随零。但同样的格式也不适用于 .1
,它给出的十进制数字超出了浮点数的实际机器精度:
>>> format(0.1, '.20f')
'0.10000000000000000555'
如果我的数字是 4.5678e-20
,使用 .20f
仍然会失去相对的精度:
>>> format(4.5678e-20, '.20f')
'0.00000000000000000005'
这就是 这些方法不符合我的要求。
这就引出了一个问题: 以十进制格式打印任意浮点数(与 ABC0(或 Python 3上的 str(n)
)中的浮点数具有相同的数字) ,但总是使用十进制格式,而不是科学记数法,哪种方法最简单、效果最好。
也就是说,将浮点值 0.00000005
转换为字符串 '0.00000005'
、 0.1
转换为 '0.1'
、 420000000000000000.0
转换为 '420000000000000000.0'
或 420000000000000000
并将浮点值 -4.5678e-5
格式化为 '-0.000045678'
的函数或操作。
赏金期过后: 似乎至少有两种可行的方法,正如 Karin 展示的那样,与我在 Python 2上的初始算法相比,使用字符串操作可以获得显著的速度提升。
因此,
decimal
模块,那么 Karin 使用字符串操作的方法就是实现这一点的方法。由于我主要是在 Python 3上开发,我将接受我自己的答案,并将奖励给 Karin。