Python中科学计数法的指数位数

6
在Python中,科学计数法总是给出2位指数:
print('%17.8E\n' % 0.0665745511651039)
6.65745512E-02

然而,我非常想要像这样的3个数位:
6.65745512E-002

我们能够在Python内置的配置/函数中完成这个吗?

我知道我的问题基本上和这个问题是一样的:Python - number of digits in exponent,但是这个问题是4年前提出的,我不想调用这样一个函数一千次。我希望现在应该有更好的解决方案。


1
可能是Python - number of digits in exponent的重复问题。 - vsminkov
2个回答

4

很遗憾,您无法更改此默认行为,因为您无法覆盖str方法。

但是,您可以将float封装起来,并使用__format__方法:

class MyNumber:
    def __init__(self, val):
        self.val = val

    def __format__(self,format_spec):
        ss = ('{0:'+format_spec+'}').format(self.val)
        if ( 'E' in ss):
            mantissa, exp = ss.split('E')            
            return mantissa + 'E'+ exp[0] + '0' + exp[1:]
        return ss


     print( '{0:17.8E}'.format( MyNumber(0.0665745511651039)))

是的,将浮点数转换为字符串的方法对于print()函数完美适用。谢谢。但是,我还想将输出写入文件,但只有一半成功了:“ValueError: invalid literal for float(): -4.10522747+00”。我需要你的帮助。让我编辑我的原始问题以解释这个错误。 - IanHacker
当数字在1 <= n < 10之间时,格式不起作用,只显示2位数字。-6.08474553E-001 -4.10522747+00 -4.75716448+00 -1.58045329E-002 4.72555542+00(对于print()也无效)。你能修复一下吗? - IanHacker
更新为正指数 - napuzba
它工作得很好。现在它显示所有内容都是三位数字。-6.08474553E-001 -4.10522747E+000 -4.75716448E+000 -1.58045329E-002 4.72555542E+000非常感谢! - IanHacker

0

您可以使用自己的格式化程序并覆盖 format_field

import string
class MyFormatter(string.Formatter): 
    def format_field(self, value, format_spec):
        ss = string.Formatter.format_field(self,value,format_spec)
        if format_spec.endswith('E'):
            if ( 'E' in ss):
                mantissa, exp = ss.split('E')
                return mantissa + 'E'+ exp[0] + '0' + exp[1:]                  
        return ss

print( MyFormatter().format('{0:17.8E}',0.00665745511651039) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接