Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,如何按原样打印浮点数而不进行任何截断?_Python - Fatal编程技术网

在python中,如何按原样打印浮点数而不进行任何截断?

在python中,如何按原样打印浮点数而不进行任何截断?,python,Python,我有一些数字0.0000002345E^-60。我想按原样打印浮点值。 怎么做? 打印%f将其截断为6位数字。另外%n.nf给出了固定的数字。不截断的打印方法是什么。如果我理解,您想打印浮点吗 问题是,无法打印浮点 只能打印浮点的字符串表示形式。简而言之,你不能打印一个浮点数,这就是你的答案 如果您接受需要打印浮点数的字符串表示,并且您的问题是如何为浮点数的字符串表示指定首选格式,那么根据您在问题中不清楚的注释判断 如果要以指数表示法打印浮点的字符串表示形式,则格式规范语言允许: {:g}或{:

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

如果我理解,您想打印浮点吗

问题是,无法打印浮点

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

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

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

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

假设您的值是
my\u float
“{:G}”.format(my\u float)
将以Python解释器打印输出的方式打印输出。您可能只需打印数字而不进行任何格式设置,就可以得到相同的精确结果

如果您的目标是以非指数形式以当前精度打印浮点的字符串表示,则用户描述了一种将浮点转换为十进制对象的好方法

如果出于某种原因,您不想这样做,您可以执行中提到的操作。但是,您应该将“最大位数”设置为
sys.float\u info.max\u 10\u exp
,而不是答案中使用的14。这要求您在代码之前的某个时间点导入系统

这方面的一个完整例子是:

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)
但总的来说,我认为将小数点转换为小数点的方法可能更好。

像这样吗

>>> 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
您可以使用:

这是由literal
0.000000 2345E-60
创建的
float
的实际值。它的值是一个可表示为python浮点的数字,最接近实际值
0.0000002345*10**-60


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

你希望如何打印?不确定是否可以轻松打印非标准化的科学打印。我希望它按原样打印。没有任何舍入或截断。难道你不能只打印60个0,然后打印其余的吗?例如,你想打印0.000000 2345?????好的,如果我的变量m包含上述值。我如何获得.00034E-56形式的字符串?你永远不应该有一个Python浮点值,如你所示。Python(至少在用于Windows的cPython 2.7.x中)将.0003434E-56显示为3.434E-60,这是等效的且更紧凑。
>>> from decimal import Decimal
>>> str(Decimal(0.0000002345e-60))
'2.344999999999999860343602938602754401109865640550232148836753621775217856801120686600683401464097113374472942165409862789978024748827516129306833728589548440037314681709534891496105046826414763927459716796875E-67'