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中科学计数法中的指数数字的主要内容,如果未能解决你的问题,请参考以下文章