繁体   English   中英

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

[英]How to print floating point numbers as it is without any truncation in python?

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

像这样?

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

正如您可能从输出中注意到的那样,您想如何做并不是那么清楚。 由于浮点表示,您会失去精度并且无法真正准确地表示数字。 因此,您希望数字停止显示的位置并不十分清楚。

另请注意,指数表示通常用于更明确地显示数字的有效位数

您还可以使用decimal来避免由于二进制浮点数截断而丢失精度:

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

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

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

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

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

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

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

假设您的值是my_float"{:G}".format(my_float)将按照 Python 解释器打印的方式打印输出。 您可能只打印没有任何格式的数字并获得相同的确切结果。

如果您的目标是以非指数形式以当前精度打印浮点数的字符串表示,用户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)

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

您可以使用decimal.Decimal

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

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

float一般用于近似计算。 如果你想要准确的结果,你应该使用其他的东西,比如提到的Decimal

暂无
暂无

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

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