强制python不以标准格式/科学记数法/指数形式输出浮点数

jdb*_*org 10 python

所以这很好用:

>>> float(1.0e-1)
0.10000000000000001
Run Code Online (Sandbox Code Playgroud)

但是当处理更大的数字时,它将无法打印:

>>> float(1.0e-9)
1.0000000000000001e-09
Run Code Online (Sandbox Code Playgroud)

有没有办法强迫这个?也许使用numpy或其他东西.

Cat*_*lus 16

print '{0:.10f}'.format(1.0e-9)
Run Code Online (Sandbox Code Playgroud)

文档中的字符串格式.


zwo*_*wol 11

每个人都建议使用f字符串格式代码隐含地假设可以修复小数点后的位数.这对我来说似乎是一个非常不稳定的假设.但是,如果您没有做出这样的假设,那么就没有内置机制来做您想做的事情.这是我遇到类似问题时遇到的最好的黑客(在PDF生成器中 - PDF中的数字不能使用指数表示法).您可能希望将所有bs从字符串中删除,并且此处可能还有其他Python3-isms.

_ftod_r = re.compile(
    br'^(-?)([0-9]*)(?:\.([0-9]*))?(?:[eE]([+-][0-9]+))?$')
def ftod(f):
    """Print a floating-point number in the format expected by PDF:
    as short as possible, no exponential notation."""
    s = bytes(str(f), 'ascii')
    m = _ftod_r.match(s)
    if not m:
        raise RuntimeError("unexpected floating point number format: {!a}"
                           .format(s))
    sign = m.group(1)
    intpart = m.group(2)
    fractpart = m.group(3)
    exponent = m.group(4)
    if ((intpart is None or intpart == b'') and
        (fractpart is None or fractpart == b'')):
        raise RuntimeError("unexpected floating point number format: {!a}"
                           .format(s))

    # strip leading and trailing zeros
    if intpart is None: intpart = b''
    else: intpart = intpart.lstrip(b'0')
    if fractpart is None: fractpart = b''
    else: fractpart = fractpart.rstrip(b'0')

    if intpart == b'' and fractpart == b'':
        # zero or negative zero; negative zero is not useful in PDF
        # we can ignore the exponent in this case
        return b'0'

    # convert exponent to a decimal point shift
    elif exponent is not None:
        exponent = int(exponent)
        exponent += len(intpart)
        digits = intpart + fractpart
        if exponent <= 0:
            return sign + b'.' + b'0'*(-exponent) + digits
        elif exponent >= len(digits):
            return sign + digits + b'0'*(exponent - len(digits))
        else:
            return sign + digits[:exponent] + b'.' + digits[exponent:]

    # no exponent, just reassemble the number
    elif fractpart == b'':
        return sign + intpart # no need for trailing dot
    else:
        return sign + intpart + b'.' + fractpart
Run Code Online (Sandbox Code Playgroud)