Python 将科学符号转换为人类可读的浮点数

Python 将科学符号转换为人类可读的浮点数,python,Python,如何以编程方式接受如下浮点值: 1.87491348956e-28 0.000000000000000000000000000187491348956 并将其转换为如下所示的浮点(可能是字符串): 1.87491348956e-28 0.000000000000000000000000000187491348956 (我认为这是正确的零数)计算小数点后的位数,并添加+指数以获得输出精度: '%.39f' % 1.87491348956e-28 计算小数点后的位数,并添加+指数以获得输出

如何以编程方式接受如下浮点值:

1.87491348956e-28
0.000000000000000000000000000187491348956
并将其转换为如下所示的浮点(可能是字符串):

1.87491348956e-28
0.000000000000000000000000000187491348956

(我认为这是正确的零数)

计算小数点后的位数,并添加+指数以获得输出精度:

'%.39f' % 1.87491348956e-28

计算小数点后的位数,并添加+指数以获得输出精度:

'%.39f' % 1.87491348956e-28
编辑:我忘了删除一些格式化部分。最新版本稍微短一点

它是如何工作的

您可以将格式字符串称为递归字符串。在第一步中,只有内部部分,即
%d
被解释为格式信息,并被浮点数的计算长度替换。让我们将该长度称为X。因此,在第一次格式化之后,剩余的格式字符串将读取
%1.Xf
,并用于实际格式化数字。请注意,在第一步之后,
%%
被单个
%%
替换

编辑:

Rob_sigma添加了一个带有更简单解决方案的注释:

a=1.87491348956e-28
base,expo = str(a).split('e')
print '%.*f'%(len(base)-2+abs(int(expo)),a)
我必须承认,我以前从未见过这种语法

编辑:我忘了删除一些格式化部分。最新版本稍微短一点

它是如何工作的

您可以将格式字符串称为递归字符串。在第一步中,只有内部部分,即
%d
被解释为格式信息,并被浮点数的计算长度替换。让我们将该长度称为X。因此,在第一次格式化之后,剩余的格式字符串将读取
%1.Xf
,并用于实际格式化数字。请注意,在第一步之后,
%%
被单个
%%
替换

编辑:

Rob_sigma添加了一个带有更简单解决方案的注释:

a=1.87491348956e-28
base,expo = str(a).split('e')
print '%.*f'%(len(base)-2+abs(int(expo)),a)

我必须承认,我以前从未见过这种语法。

基于其他答案,我能够创建我想要的:

f = 1.23456789e-28
d = abs(int(str(f).split('e')[1]))
print format(f, '.{0}f'.format(d)) + ' %'
不同之处在于,上述函数将自动生成一个人类可读的浮点数,该浮点数始终与所需的位数完全相同。此外,我可以做一个“d+=10”或类似的操作来添加额外的有效数字

下面是一些示例输出,以了解我的意思:

0.0000000000000000000000000000003 %
0.0000000000000000000000000000006 %
0.0000000000000000000000000000009 %
0.000000000000000000000000000001 %
0.000000000000000000000000000001 %
0.000000000000000000000000000002 %
0.000000000000000000000000000002 %
0.000000000000000000000000000002 %
0.000000000000000000000000000003 %
0.000000000000000000000000000003 %
0.000000000000000000000000000003 %
0.000000000000000000000000000004 %
0.000000000000000000000000000004 %
0.000000000000000000000000000004 %
0.000000000000000000000000000004 %
0.000000000000000000000000000005 %
0.000000000000000000000000000005 %
0.000000000000000000000000000005 %
0.000000000000000000000000000006 %
0.000000000000000000000000000006 %
0.000000000000000000000000000006 %
0.000000000000000000000000000006 %
0.000000000000000000000000000007 %
0.000000000000000000000000000007 %
0.000000000000000000000000000007 %
0.000000000000000000000000000008 %
0.000000000000000000000000000008 %
0.000000000000000000000000000008 %
0.000000000000000000000000000009 %
0.000000000000000000000000000009 %
0.000000000000000000000000000009 %
0.000000000000000000000000000009 %
0.000000000000000000000000000010 %
0.000000000000000000000000000010 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %

看看当数字变大时,产生的浮动如何变短以匹配。

基于其他答案,我能够创建我想要的:

f = 1.23456789e-28
d = abs(int(str(f).split('e')[1]))
print format(f, '.{0}f'.format(d)) + ' %'
不同之处在于,上述函数将自动生成一个人类可读的浮点数,该浮点数始终与所需的位数完全相同。此外,我可以做一个“d+=10”或类似的操作来添加额外的有效数字

下面是一些示例输出,以了解我的意思:

0.0000000000000000000000000000003 %
0.0000000000000000000000000000006 %
0.0000000000000000000000000000009 %
0.000000000000000000000000000001 %
0.000000000000000000000000000001 %
0.000000000000000000000000000002 %
0.000000000000000000000000000002 %
0.000000000000000000000000000002 %
0.000000000000000000000000000003 %
0.000000000000000000000000000003 %
0.000000000000000000000000000003 %
0.000000000000000000000000000004 %
0.000000000000000000000000000004 %
0.000000000000000000000000000004 %
0.000000000000000000000000000004 %
0.000000000000000000000000000005 %
0.000000000000000000000000000005 %
0.000000000000000000000000000005 %
0.000000000000000000000000000006 %
0.000000000000000000000000000006 %
0.000000000000000000000000000006 %
0.000000000000000000000000000006 %
0.000000000000000000000000000007 %
0.000000000000000000000000000007 %
0.000000000000000000000000000007 %
0.000000000000000000000000000008 %
0.000000000000000000000000000008 %
0.000000000000000000000000000008 %
0.000000000000000000000000000009 %
0.000000000000000000000000000009 %
0.000000000000000000000000000009 %
0.000000000000000000000000000009 %
0.000000000000000000000000000010 %
0.000000000000000000000000000010 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000001 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %
0.00000000000000000000000000002 %

看看当数字变大时,产生的浮点如何变短以匹配。

。。。科学家不是人吗?;-)说真的,我发现上面的符号更可读!所以科学家不是人吗?;-)说真的,我发现上面的符号更可读!嗯,是的,如果你真的想炫耀lol,但这真的是一个伟大的解决方案哇。。。看起来你的猫跳到了你的键盘上,但它能工作。不过,您能补充一点说明吗?@tobias_k我根据基和指数的长度创建一个动态格式字符串,例如,
'%%1.%df“%23
->
'%1.23f'
@tobias_k我明白了。你是说我应该把它添加到我的答案中吗?
打印''%f'(len(base)-2+abs(int(expo)),a)
看起来比调用两次
%
操作符更可读。如果你真的想炫耀lol,是的,但这确实是一个很好的解决方案哇。。。看起来你的猫跳到了你的键盘上,但它能工作。不过,您能补充一点说明吗?@tobias_k我根据基和指数的长度创建一个动态格式字符串,例如,
'%%1.%df“%23
->
'%1.23f'
@tobias_k我明白了。你是说我应该把它添加到我的答案中?
打印''%f'(len(base)-2+abs(int(expo)),a)
似乎比调用两次
%
操作符更可读。我想你应该接受其中一个答案,而不是提取别人的答案来回答你自己。@ChristianK。当时,你的答案还不存在,否则我会选择正确的答案。事实上,我还是会选择你的答案作为正确答案,让我的答案放在一边。你只需调用一次format,而不添加字符串,就可以得到同样的效果:
'print{:.{:}f}%'。format(f,d)
好吧,我想你应该接受其中一个答案,而不是提取别人的答案来回答你自己。@ChristianK。当时,你的答案还不存在,否则我会选择正确的答案。事实上,我仍然会选择您的作为正确的一个,让我的放在一边。您只需调用一次format,而无需添加字符串即可获得相同的效果:
'print{:.{:}f}%'。format(f,d)