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

Posted

技术标签:

【中文标题】Python中科学计数法中的指数数字【英文标题】:exponent digits in scientific notation in Python 【发布时间】:2016-08-27 19:03:44 【问题描述】:

在 Python 中,科学记数法总是给我 2 位的指数:

print('%17.8E\n' % 0.0665745511651039)
6.65745512E-02

但是,我非常希望有 3 位数字,例如:

6.65745512E-002

我们可以使用 Python 中的内置配置/函数来做到这一点吗?

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

【问题讨论】:

Python - number of digits in exponent的可能重复 【参考方案1】:

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

但是,您可以包装浮点数,并使用__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)))

【讨论】:

是的,wrapping-the-float 方法非常适用于 print()。谢谢你。但是,我也想将输出写入一个文件,它只工作了一半:'ValueError: invalid literal for float(): -4.10522747+00' 我需要你的帮助。让我编辑我原来的问题来解释这个错误。 当数字在 1 更新为正指数 它就像一个魅力。现在它以 3 位数字显示。 ` -6.08474553E-001 -4.10522747E+000 -4.75716448E+000 -1.58045329E-002 4.72555542E+000` 非常感谢!【参考方案2】:

您可以使用自己的格式化程序并覆盖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) )

【讨论】:

以上是关于Python中科学计数法中的指数数字的主要内容,如果未能解决你的问题,请参考以下文章

Python:带有上标指数的科学记数法

从科学记数法中提取指数

以科学计数法 python 优雅地打印

科学计数法1

科学计数法中的尾数基指数

强制python不以标准形式/科学记数法/指数形式输出浮点数[重复]