如何在python中没有任何截断的情况下打印浮点数?

时间:2013-11-18 13:27:43

标签: python

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

3 个答案:

答案 0 :(得分:2)

喜欢这个吗?

>>> print('{:.100f}'.format(0.0000002345E-60))
0.0000000000000000000000000000000000000000000000000000000000000000002344999999999999860343602938602754

正如您可能从输出中注意到的那样,并不是很清楚您想要如何做到这一点。由于浮动表示,您将失去精确度,并且无法准确地表示数字。因此,您不希望数字停止显示在哪里。

另请注意,指数表示通常用于更明确地显示数字significant digits的数量。

由于二进制浮点截断,您还可以使用decimal不会丢失精度:

>>> from decimal import Decimal
>>> d = Decimal('0.0000002345E-60')
>>> p = abs(d.as_tuple().exponent)
>>> print(('{:.%df}' % p).format(d))
0.0000000000000000000000000000000000000000000000000000000000000000002345

答案 1 :(得分:0)

如果我明白,你想要打印浮动?

问题是,你不能打印浮动。

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

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

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

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

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

如果您的目标是以非指数形式打印float的字符串表示形式,那么用户poke描述了一种通过将float转换为Decimal对象来实现此目的的好方法。

如果由于某种原因,您不想这样做,您可以执行this answer中提到的操作。但是,您应将'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)

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

答案 2 :(得分:0)

您可以使用decimal.Decimal

>>> from decimal import Decimal
>>> str(Decimal(0.0000002345e-60))
'2.344999999999999860343602938602754401109865640550232148836753621775217856801120686600683401464097113374472942165409862789978024748827516129306833728589548440037314681709534891496105046826414763927459716796875E-67'

这是由文字float创建的0.0000002345e-60的实际值。它的值是一个可表示为python float的数字,它最接近实际的0.0000002345 * 10**-60

float通常应用于近似计算。如果您想要准确的结果,您应该使用其他内容,例如提及Decimal