这是我的代码:

x = 1.0
y = 100000.0    
print x/y

我的商显示为1.00000e-05。

有没有办法压制科学符号,让它显示为 0.00001 ?我将使用结果作为字符串。


当前回答

将浮点数显示为任意数量的有效数字的更简单解决方案。这里不需要numpy或列表推导式:

def sig(num, digits=3):
    "Return number formatted for significant digits"
    if num == 0:
        return 0
    negative = '-' if num < 0 else ''
    num = abs(float(num))
    power = math.log(num, 10)
    if num < 1:
        step = int(10**(-int(power) + digits) * num)
        return negative + '0.' + '0' * -int(power) + str(int(step)).rstrip('0')
    elif power < digits - 1:
        return negative + ('{0:.' + str(digits) + 'g}').format(num)
    else:
        return negative + str(int(num))

在示例中,我去掉了后面的0并显示完整的整数:sig(31415.9) = 31415而不是31400。如果您不喜欢修改代码,请随意修改。

测试:

for power in range(-8,8):
    num = math.pi * 10**power
    print(str(num).ljust(25), sig(num))

其他回答

使用新版本”。格式(还记得指定后面有多少位数字。你希望显示的,这取决于浮点数有多小)。请看这个例子:

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'

如上所示,默认是6位数!这对我们的案例没有帮助,所以我们可以使用这样的代码:

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'

更新

从Python 3.6开始,可以使用新的格式化字符串字面值进行简化,如下所示:

>>> f'{a:.20f}'
'-0.00000000000000007186'

从3.6开始(可能适用于稍微老一点的3。X也是),这是我的解决方案:

import locale
locale.setlocale(locale.LC_ALL, '')

def number_format(n, dec_precision=4):
    precision = len(str(round(n))) + dec_precision
    return format(float(n), f'.{precision}n')

精度计算的目的是确保我们有足够的精度来避免科学计数法(默认精度仍然是6)。

dec_precision参数增加了用于小数点的额外精度。由于这使用了n格式,因此不会添加无关紧要的零(与f格式不同)。N还将负责呈现不带小数的整数。

N确实需要浮点数输入,因此需要强制转换。

如果它是一个字符串,那么使用内置的float对其进行转换,例如: 打印(“%。5f" %浮动("1.43572 -03")) 答案:0.00143572

由于这是谷歌上的顶部结果,我将在这里发布失败后,为我的问题找到一个解决方案。如果你想格式化一个浮点对象的显示值,并让它保持一个浮点,而不是一个字符串,你可以使用这个解决方案:

创建一个新类,用于修改浮点值的显示方式。

from builtins import float
class FormattedFloat(float):

    def __str__(self):
        return "{:.10f}".format(self).rstrip('0')

您可以通过更改{:f}中的整数值来自己修改精度。

上面的大多数答案都要求您指定精度。但是如果你想像这样显示浮点数,没有不必要的零呢:

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001

Numpy给出了答案:np.format_float_positional

import numpy as np

def format_float(num):
    return np.format_float_positional(num, trim='-')