如何用Python打印多个有效数字?
对于科学应用,我需要输出非常精确的数字,所以我必须打印15个有效数字。这里已经有关于这个主题的问题了,但它们都涉及到截断数字,而不是打印更多 我意识到,如何用Python打印多个有效数字?,python,Python,对于科学应用,我需要输出非常精确的数字,所以我必须打印15个有效数字。这里已经有关于这个主题的问题了,但它们都涉及到截断数字,而不是打印更多 我意识到,print函数将输入的float转换为10个字符的字符串。此外,我还意识到了十进制模块,但这并不适合我的需要 因此,问题是,如果我需要显示10个以上的浮点数,如何方便地打印不同数量的浮点数?您可以使用字符串格式运算符%: In [3]: val = 1./3 In [4]: print('%.15f' % val) 0.333333333333
print
函数将输入的float
转换为10个字符的字符串。此外,我还意识到了十进制
模块,但这并不适合我的需要
因此,问题是,如果我需要显示10个以上的浮点数,如何方便地打印不同数量的浮点数?您可以使用字符串格式运算符%
:
In [3]: val = 1./3
In [4]: print('%.15f' % val)
0.333333333333333
或str.format()
:
在新代码中,后者是首选样式,尽管前者仍然被广泛使用
有关更多信息,请参见。使用这两种常见的打印习惯用法进行格式化。这是个人品味的问题,哪个更好
value = 10/3 #gives a float of 3.33333.....
print '%.15f' % value
print str.format('{0:.15f}', value)
我个人认为第一个更紧凑,第二个更明确。使用多个VAL时,格式具有更多功能。认为原始问题希望格式化n个有效数字,而不是n个小数点。因此,在提供更多本机内置类型之前,可能需要自定义函数?
因此,您将需要以下内容:
def float_nsf(q,n):
"""
Truncate a float to n significant figures. May produce overflow in
very last decimal place when q < 1. This can be removed by an extra
formatted print.
Arguments:
q : a float
n : desired number of significant figures
Returns:
Float with only n s.f. and trailing zeros, but with a possible small overflow.
"""
sgn=np.sign(q)
q=abs(q)
n=int(np.log10(q/10.)) # Here you overwrite input n!
if q<1. :
val=q/(10**(n-1))
return sgn*int(val)*10.**(n-1)
else:
val=q/(10**n)
return sgn*int(val)*10.**n
def浮点值(q,n):
"""
将浮点数截断为n个有效数字。可能会在中产生溢出
q<1时的最后一个小数位。可通过额外的
格式化打印。
论据:
问:浮动汇率
n:所需的有效数字数
返回:
仅使用n s.f.和尾随零进行浮点运算,但可能会出现小溢出。
"""
sgn=np.符号(q)
q=abs(q)
n=int(np.log10(q/10.)#这里覆盖输入n!
如果q你可以使用我写的这个函数,它似乎工作得很好,而且非常简单
def nsf(num, n=1):
"""n-Significant Figures"""
numstr = ("{0:.%ie}" % (n-1)).format(num)
return float(numstr)
它首先使用指数表示法将数字转换为字符串
然后将其作为浮点值返回李>
一些测试:
>>> a = 2./3
>>> b = 1./3
>>> c = 3141592
>>> print(nsf(a))
0.7
>>> print(nsf(a, 3))
0.667
>>> print(nsf(-a, 3))
-0.667
>>> print(nsf(b, 4))
0.3333
>>> print(nsf(-b, 2))
-0.33
>>> print(nsf(c, 5))
3141600.0
>>> print(nsf(-c, 6))
-3141590.0
我希望这对你有帮助;) 让我们:
>>> num = 0.0012345
对于3个重要数字:
小数点后3位:
有关e、e、f、f、g、g、n、%和None所提供的任何其他要求,请参见的底部的“浮点和十进制的表示类型”表。要显示n个有效数字(非小数位数),请使用“g”格式:
有关精度的详细信息,请参见:
精度是一个十进制数字,指示应输入多少位数
对于已格式化的浮点值,显示在小数点后
使用“f”和“f”,或在小数点之前和之后使用浮点
点值格式为“g”或“g”。对于非数字类型,请单击该字段
指示最大字段大小-换句话说,有多少个字符
将从字段内容中使用。精度是不允许的
整数值
请记住,float
实际上可能无法以所需的精度表示您使用的值,这意味着您的计算可能会大错特错。@Wooble非常好的答案深入探讨了您提出的问题。值得一看。但是Python中没有比float更精确的数据类型了,是吗?print({0:.15f}.format(val))
也是在新格式中执行此操作的另一种方法。请注意,这不会打印15个有效数字,而只打印小数点后的15个数字。对于非常大或非常小的数字,这没有多大意义。嗯,使用“%.15e”
可能更合理。是的,这是小数位数,不是有效数字。嗯,这一直以指数表示法吐出数字。可能是因为我稍后将它们转换回字符串?,即str(float(…),所以应该将其标记为正确答案。请看,这以科学的格式显示数字,例如12.0=>“1.2e+01”,这可能不是人们所期望的。@quantoid根据我的回复,f'{12.0:.3}'='12.0'
。但是当abs(float(f'{num:.3}')>=10**2
时,您似乎是正确的。这也不是完全不合理的行为。。。例如,您将如何处理1234.56
?打印1230
|1230.
会产生误导,因为不是浮点数
|0实际上是4
。打印1.23e4
似乎是这里唯一合理的解决方案。在任何情况下,我认为大多数人都想打印数字s.t.abs(float(float)(f'{num:.{d}'))<10**d
我投了反对票,因为这在小数点后是15位,而不是15位。我认为是正确的。g
上的文档:精确规则如下:假设使用表示类型'e'
和精度p-1
格式化的结果将具有指数exp。如果-4
>>> num = 0.0012345
>>> f'{num:.3}'
'0.00123'
>>> f'{num:.3f}'
'0.001'
>>> x = 1.23
>>> print("%.2g" % x)
1.2
>>> x = 12.3
>>> print("%.2g" % x)
12