繁体   English   中英

计算有效的小数点以格式化浮点数

[英]Work out significant decimal points to format floating point number

我发现涵盖了如何抑制科学计数法,但是我想更进一步,还可以算出格式化字符串(即表示数字所需的小数点位数)。

到目前为止,我的想法是假设分辨率很高(在本示例中为20),并按照此处接受的答案中的建议减少尾随零。 也许有更好的方法来实现这一目标?

>>> f = 0.00000008
>>> s = '{:.20f}'.format(f)
>>> s
'0.00000008000000000000'
>>> s.rstrip('0')
'0.00000008'

请注意,我也不希望使用科学记数法(使用{:g}的格式化字符串会得到)。

浮点数的最大有效位数为15 (幂与此分开)。 因此,没有必要考虑更多的数字,因为它们不正确。 知道给定数字的十进制幂将告诉您前面要填充多少个零。

如果您要格式化的内容永远不会超过其一,那么满足以下条件即可:

from math import log10

def floatformat(f):
    pwr = log10(f)
    return '{:.0{}f}'.format(f, int(abs(pwr)) + 15).rstrip('0')

但是,如果要解析任何可能的浮点值,则必须对大数进行一些不同的处理才能获得尾随零而不是随机的不准确数字。

def floatformat(f):
    sigs = 15  # number of accurate digits that a float can contain
    pwr = log10(f)

    if pwr > sigs:  # power above accurate digits
         s = '{:.{}f}'.format(f / 10 ** int(pwr), sigs)
         s = s.replace('.', '')  # remove decimal point, no longer necessary here
         s = s + '0' * (int(pwr) - sigs)  # add in trailing zeros

    elif 0 < pwr <= sigs:  # power within accurate digits
        s = '{:.{}f}'.format(f, sigs - int(pwr)).rstrip('0')

    else:  # power below accurate digits
        s = '{:.0{}f}'.format(f, int(abs(pwr)) + sigs).rstrip('0')

    if s[-1] == '.': s = s[:-1]  # remove trailing decimal point if needed
    return s

所有这些操作就是保留准确的数字,然后将它们重新排列以具有正确的功能而没有科学的符号。

例子:

>>> floatformat(0.00000008)
'0.00000008'
>>> floatformat(0.0000000000000000000000000000008)
'0.0000000000000000000000000000008'
>>> floatformat(0.00000000000000000000000000000080067)
'0.00000000000000000000000000000080067'
>>> floatformat(2.31451103e7)
'23145110.3'
>>> floatformat(2.31451103e3)
'2314.51103'
>>> 935.16087e203 == float(floatformat(935.16087e203))  # conversion check to see if power is handled correctly
True
>>> import sys
>>> floatformat(sys.float_info.max)
'179769313486231600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
>>> floatformat(sys.float_info.min)
'0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM