点前多于 1 位的类科学符号

scientific-like notation with more than 1 digit before the point

在 python 中是否有任何方法可以从一个数字中生成一个字符串,其执行方式如下:

在那种情况下,小数点后总是 4 位小数(如果适用,用零填充)

也总是小数点前2位

您可以根据科学计数法编写自己的格式函数

def format(num,kk,cc=12):
    # kk - digits before dot , cc - digits after dot
    fmt = '{0:.'+str(kk+cc-1)+'e}'
    ss = fmt.format(num);
    s1 = ss.replace('.','')
    p1 = s1.split('e')
    a1 = p1[0]
    a2 = int(p1[1])
    return '{0}.{1}e{2}'.format(a1[0:kk],a1[kk:],a2-kk+1) 

为方便起见,您可以创建具有自定义格式的对象:

class MyNum:
    def __init__(self,value):
        self.value = value
    def __format__(self,fmt):
        args = fmt.split('.')
        a1 = int(args[0]) if len(args) > 0 else 1
        a2 = int(args[1]) if len(args) > 1 else 6
        return format(self.value,a1,a2)

现在,您可以使用以下格式:

print('{0:3.6}'.format(MyNum(25.123456789)))
#print 251.234568e-1

我很确定没有内置的浮点格式可以做到这一点,但它很容易伪造:将数字的 1/10 转换为正常的科学记数法,然后将小数点移动一位。 ..

def unscientific_notation(n):
    rv = "%.5e" % (n / 10.0)
    rv = rv[0] + rv[2] + rv[1] + rv[3:]     # x.yz -> xy.z
    if rv.endswith("e+00"):    # handle 10..99 as specified
        rv = rv[:-4]
    return rv

对于 1..9 范围内的数字可能需要一个额外的特殊情况 - 将 5 显示为 50e-1 似乎可能不是所需的结果。

您可以使用 math.log10 和一个似乎适合您的示例的公式(需要更多测试):

from math import log10, ceil
numbers = [30.0123456789, 0.0123456789, 0.000123456789, 12345.67891011]

n = 2
for number in numbers:
    e = ceil(log10(number) - n)
    n_digits = number * 10**-e
    if e:
        print('%.4fe%d' % (n_digits, e))
    else:
        print('%.4f' % number)

#   30.0123
#   12.3457e-3
#   12.3457e-5
#   12.3457e3

作为奖励,它应该适用于任何 n。随着 n=3:

300.1235e-1
123.4568e-4
123.4568e-6
123.4568e2