如何用Python打印多个有效数字?

如何用Python打印多个有效数字?,python,Python,对于科学应用,我需要输出非常精确的数字,所以我必须打印15个有效数字。这里已经有关于这个主题的问题了,但它们都涉及到截断数字,而不是打印更多 我意识到,print函数将输入的float转换为10个字符的字符串。此外,我还意识到了十进制模块,但这并不适合我的需要 因此,问题是,如果我需要显示10个以上的浮点数,如何方便地打印不同数量的浮点数?您可以使用字符串格式运算符%: In [3]: val = 1./3 In [4]: print('%.15f' % val) 0.333333333333

对于科学应用,我需要输出非常精确的数字,所以我必须打印15个有效数字。这里已经有关于这个主题的问题了,但它们都涉及到截断数字,而不是打印更多

我意识到,
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