2012-02-23 26 views
8

对于科学应用,我需要输出非常精确的数字,所以我必须打印15位有效数字。这里已经有关于这个话题的问题,但是他们都在关注截取的数字,而不是打印更多如何在Python中打印许多有效数字?

我意识到print函数将输入float转换为10个字符string。此外,我开始意识到decimal模块,但这不符合我的需求。

所以问题是,我怎样才能轻松地打印出浮动数字的显着数字,我需要显示10个以上的数字?

+0

记住了'float'实际可能不能够代表你正在使用的精度值你需要,这意味着你的计算很可能是非常错误的。 – geoffspear 2012-02-23 15:46:49

+0

@Wooble [This](http://stackoverflow.com/a/6163157/566644)非常好的答案深入到你正在提出的问题。值得一看。 – 2012-02-23 16:02:55

+0

但是没有比Python中float更精确的数据类型,是吗? – Ingo 2012-02-24 10:55:56

回答

12

你可以使用字符串格式化操作%

In [3]: val = 1./3 

In [4]: print('%.15f' % val) 
0.333333333333333 

str.format()

In [8]: print(str.format('{0:.15f}', val)) 
Out[8]: '0.333333333333333' 

在新的代码,后者是首选的风格,但前者仍然被广泛使用。

欲了解更多信息,请参阅documentation

+6

'print('{0:.15f}'.format(val))'也是以新格式进行操作的另一种方法。 – TyrantWave 2012-02-23 16:07:45

+3

请注意,这不会打印15个_significant_ digits,而只是15个小数点后的数字。对于非常大或非常小的数字,这没有多大意义。恕我直言,使用'“%.15e”'可能更合理。 – 2016-07-01 09:18:13

3

使用这两种常见的打印习惯用于格式化。它是个人品味更好的问题。

value = 10/3   #gives a float of 3.33333..... 

print '%.15f' % value 
print str.format('{0:.15f}', value) 

我个人认为第一个更紧凑,第二个更明确。使用多个val时格式具有更多功能。

8

认为原始问题想格式化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=npy.sign(q) 
    q=abs(q) 
    n=int(npy.log10(q/10.)) # Here you overwrite input n! 
    if q<1. : 
     val=q/(10**(n-1)) 
    else: 
     val=q/(10**n) 
    return sgn*int(val)*10.**n 
1

你可以使用这个功能我写的,它似乎是工作的罚款,这是相当简单

def nsf(num, n=1): 
    """n-Significant Figures""" 
    numstr = ("{0:.%ie}" % (n-1)).format(num) 
    return float(numstr) 
  1. 它首先将使用指数表示法
  2. 然后将其返回为float

一些测试:

>>> 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 

我希望这可以帮助你;)

+0

嗯,这不断吐出数字的指数符号。也许是因为我稍后将它们转换回字符串,即str(float(...)) – DrMisha 2015-04-28 16:35:56

相关问题