如何在打印浮点数值时抑制科学计数法?

247

这是我的代码:

x = 1.0
y = 100000.0    
print x/y

我的商显示为1.00000e-05

有没有办法取消科学计数法,并将其显示为0.00001?我将把结果用作字符串。


38
很遗憾,这里没有任何回答与问题相关。如果有一种方法可以防止Python(3)在未显式指定情况下使用科学计数法,那将是很好的。所有的答案都要求用户显式地禁止科学计数法,这与通常抑制Python内部隐式使用科学计数法不同。 - BLUC
8
是的,就像R语言使用options(scipen = 999)一样。 - Leonardo Siqueira
1
@BLUC numpy 模块提供了 np.format_float_positional(),这个函数非常好用。 - D.L
这个问题本身不值得回答,但是我认为如果与.replace(",", "")结合使用,https://stackoverflow.com/questions/67879685/python-decimal-decimal-producing-result-in-scientific-notation比现有的任何答案都要好。 - Brendano257
1
Python实在是太疯狂了,与其他现代语言相比,它的内在愚蠢和缺乏实用性让我无法停止惊叹。如此恶劣的是这种畸形居然变得如此流行。 - Kirill Kay
17个回答

172

使用更新版本的''.format(还要记得指定你想显示多少位小数,这取决于浮点数有多小)。看下面的例子:

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

如上所示,默认为6位数!这对我们的案例不是很有帮助,因此我们可以使用类似以下的内容:

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

更新

从Python 3.6开始,可以使用新的格式化字符串字面值来简化操作,示例如下:

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

3
如何在指定有效数字的情况下完成这个操作? - Marses
3
我猜可以通过使用变量,给它所需的数字位数,并在需要时使用它代替字面数字,例如 f"{a:.{precision}f}" - Aziz Alto
4
你应该如何知道要使用哪个“precision”值? - user5359531
1
对我来说不起作用 time.time() #shortStuff end = time.time() print( '{:.20}'.format(end - start),"sec") - Xanlantos
@Xanlantos 请再次阅读答案。不是你的代码中的 {:.20},而是 {:.20f} - Jeyekomon
哦,天啊,那是很久以前的事了^^,但你绝对是正确的。 - Xanlantos

81

10
我建议你澄清自己的陈述,改为说“您自己管理显示的精度。” 实际的(Python内部)精度没有改变,这与其他语言经常做的不同。 - JS.

55
使用较新版本的Python(2.6及更高版本),您可以使用{{link1:''.format()}}来实现@SilentGhost建议的功能。
'{0:f}'.format(x/y)

而且由于PEP-498已经超过8年的历史,Python 3.6及更高版本支持以下功能:
f'{x/y:f}'

有人评论说要打印列表,所以这里有一个额外的一行代码:
[f'{x:f}' for x in long_list]

5
这真的是你想要的吗?我不:>>> print('{:f}'.format(0.000000123))0.000000 - duality_
1
@duality 你可能需要指定精度。'{0:.10f}' - nmichaels
如果您尝试打印值列表,也无法正常工作。我们需要一个全局格式设置。 - yeliabsalohcin

55

如果您正在使用pandas并希望对所有浮点数禁用科学计数法,另一种选择是调整pandas选项。

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format

我发现这个答案很有用,特别是与这里的其他答案结合使用,以进一步加强它的可靠性:import pandas as pd import numpy as np pd.options.display.float_format = '{:.2f}'.format np.set_printoptions(suppress=True) - Elias

53

上面的大多数答案需要您指定精度。但是如果您想以这种方式显示浮点数,即没有不必要的零:

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='-')

2
如果您想要一个一般的小数位数(即不需要在之前指定小数位数),那么这是最好的答案。 - D.L

19

对于numpy数组,您可以使用suppress命令来抑制

import numpy as np
np.set_printoptions(suppress=True)

elegant. thank you ! - undefined

10
您可以使用内置的format函数。
>>> a = -3.42142141234123e-15
>>> format(a, 'f')
'-0.000000'
>>> format(a, '.50f') # Or you can specify precision
'-0.00000000000000342142141234122994048466990874926279'

3
不幸的是,这会在美好的圆形浮点数末尾添加垃圾数字,比如:format(0.001, '.50f') = '0.00100000000000000002081668171172168513294309377670' - SurpriseDog

6

这将适用于任何指数:

def getExpandedScientificNotation(flt):
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    return return_val

4

这是使用Captain Cucumber的回答,但有两个添加。

1)允许函数获取非科学计数法数字并将它们直接返回(可以输入很多数字,其中一些数字为0.00003123 vs 3.123e-05,函数仍然能够运行)。

2)增加了负数的支持。(在原始函数中,负数将变成0.0000-108904而不是-1.08904e-05)

def getExpandedScientificNotation(flt):
    was_neg = False
    if not ("e" in flt):
        return flt
    if flt.startswith('-'):
        flt = flt[1:]
        was_neg = True 
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    if was_neg:
        return_val='-'+return_val
    return return_val

3

由于这是谷歌搜索的前几个结果,我在找不到解决方法之后才来发布问题。如果您想格式化浮点对象的显示值,并使其保持为浮点数而非字符串,则可以使用以下解决方案:

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

from builtins import float
class FormattedFloat(float):

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接