如何在python中不截断地打印浮点数?

use*_*286 6 python

我有一些数字 0.0000002345E^-60。我想按原样打印浮点值。有什么方法可以做到?print %f 将其截断为 6 位数字。%n.nf 也给出了固定数字。没有截断的打印方式是什么。

sel*_*bok 0

如果我明白的话,你想打印一个浮点数吗?

问题是,你无法打印浮点数。

您只能打印浮点数的字符串表示形式。所以,简而言之,你不能打印浮点数,这就是你的答案。

如果您接受需要打印浮点数的字符串表示形式,并且您的问题是如何指定浮点数的字符串表示形式的首选格式,那么从评论来看,您在问题中非常不清楚。

如果您想以指数表示法打印浮点数的字符串表示形式,则格式规范语言允许这样做:

{:g} 或 {:G},具体取决于您是否希望输出中的 E 大写)。这绕过了 e 和 E 类型的默认精度,从而导致指数符号之前的部分出现不需要的尾随 0。

假设您的值为my_float"{:G}".format(my_float)将以 Python 解释器打印的方式打印输出。您可能只需打印不带任何格式的数字即可获得相同的精确结果。

如果您的目标是以非指数形式打印当前精度的浮点数的字符串表示形式,则 User poke描述了一种通过将浮点数转换为 Decimal 对象来实现此目的的好方法。

如果由于某种原因您不想这样做,您可以执行此答案中提到的操作。但是,您应该将 'max_digits' 设置为sys.float_info.max_10_exp,而不是答案中使用的 14。import sys这需要您在代码之前的某个时刻进行。

一个完整的例子是:

import math
import sys

def precision_and_scale(x):
    max_digits = sys.float_info.max_10_exp
    int_part = int(abs(x))
    magnitude = 1 if int_part == 0 else int(math.log10(int_part)) + 1
    if magnitude >= max_digits:
        return (magnitude, 0)
    frac_part = abs(x) - int_part
    multiplier = 10 ** (max_digits - magnitude)
    frac_digits = multiplier + int(multiplier * frac_part + 0.5)
    while frac_digits % 10 == 0:
        frac_digits /= 10
    scale = int(math.log10(frac_digits))
    return (magnitude + scale, scale)

f = 0.0000002345E^-60

p, s = precision_and_scale(f)

print "{:.{p}f}".format(f, p=p)
Run Code Online (Sandbox Code Playgroud)

但我认为总体而言,涉及转换为 Decimal 的方法可能更好。