点前多于 1 位的类科学符号
scientific-like notation with more than 1 digit before the point
在 python 中是否有任何方法可以从一个数字中生成一个字符串,其执行方式如下:
原数:30.0123456789
- 结果:30.0123
原始数字:0.0123456789
- 结果:12.3457e-3
原始数字:0.000123456789
- 结果:12.3457e-5
原号:12345.67891011
- 结果:12.3457e3
在那种情况下,小数点后总是 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
在 python 中是否有任何方法可以从一个数字中生成一个字符串,其执行方式如下:
原数:30.0123456789
- 结果:30.0123
原始数字:0.0123456789
- 结果:12.3457e-3
原始数字:0.000123456789
- 结果:12.3457e-5
原号:12345.67891011
- 结果:12.3457e3
在那种情况下,小数点后总是 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