Python 打印浮点值时如何抑制科学记数法?

Python 打印浮点值时如何抑制科学记数法?,python,floating-point,Python,Floating Point,这是我的密码: x = 1.0 y = 100000.0 print x/y 我的商显示为1.00000 E-05 有没有办法压制科学记数法并使其显示为 0.00001?我将使用结果作为字符串 '%f' % (x/y) 但你需要自己管理精确性。e、 g '%f' % (1/10**8) 将仅显示零。 或者对于Python 3或,除了SG的答案之外,还可以使用十进制模块: from decimal import Decimal x = str(Decimal(1) / Decima

这是我的密码:

x = 1.0
y = 100000.0    
print x/y
我的商显示为
1.00000 E-05

有没有办法压制科学记数法并使其显示为
0.00001
?我将使用结果作为字符串

'%f' % (x/y)
但你需要自己管理精确性。e、 g

'%f' % (1/10**8)
将仅显示零。


或者对于Python 3或

,除了SG的答案之外,还可以使用十进制模块:

from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))

# x is a string '0.0001'

对于较新版本的Python(2.6及更高版本),您可以使用来完成@SilentGhost建议的任务:

'{0:f}'.format(x/y)

如果是
字符串
,则在其上使用内置的
浮点
进行转换,例如:
打印(“%.5f”%float(“1.43572e-03”)

回答:
0.00143572

使用较新版本的
''。格式
(请记住指定希望显示的
后面的数字数量,这取决于浮点数的大小)。请参见此示例:

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'
如上所示,默认值为6位!这对我们的案例示例没有帮助,因此我们可以使用如下内容:

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'
更新 从Python 3.6开始,可以使用新的简化,如下所示:

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

这适用于任何指数:

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
def getExpandedScientificNotation(flt):
str_vals=str(flt).split('e'))
coef=浮动(str\u vals[0])
exp=int(str\u vals[1])
返回值=“”
如果int(exp)>0:
return_val+=str(coef).替换('.','')
return_val+=''.join(['0'表示范围内的u)(0,abs(exp-len(str(coef).split('.)[1]))))
elif int(exp)<0:
return_val+=“0”
return_val+=''.join(['0'表示范围(0,abs(exp)-1)])
return_val+=str(coef).替换('.','')
返回值
这正在使用,但有两个附加项

1) 允许函数获取非科学符号数字并按原样返回它们(因此您可以抛出大量输入,其中一些数字为0.00003123 vs 3.123e-05,并且仍然可以使用函数)

2) 增加了对负数的支持。(在原始函数中,负数将从-1.08904e-05变为0.0000-108904)

def getExpandedScientificNotation(flt):
was_neg=False
如果不是(“e”在flt中):
返回flt
如果从('-')开始飞行:
flt=flt[1:]
这是真的吗
str_vals=str(flt).split('e'))
coef=浮动(str\u vals[0])
exp=int(str\u vals[1])
返回值=“”
如果int(exp)>0:
return_val+=str(coef).替换('.','')
return_val+=''.join(['0'表示范围内的u)(0,abs(exp-len(str(coef).split('.)[1]))))
elif int(exp)<0:
return_val+=“0”
return_val+=''.join(['0'表示范围(0,abs(exp)-1)])
return_val+=str(coef).替换('.','')
如果是_neg:
返回值='-'+返回值
返回值

使用3.6.4时,我遇到了一个类似的问题,即在使用此选项时,输出文件中的一个数字会随机使用科学符号进行格式化:

fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))
我所要做的就是加上“f”:

fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))

由于这是谷歌上的最高结果,我将在未能找到解决问题的方法后在这里发布如果希望格式化浮点对象的显示值,并使其保持为浮点-而不是字符串,则可以使用此解决方案:

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

from builtins import float
class FormattedFloat(float):

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

通过更改
{:f}

中的整数值,您可以自己修改精度。如果您正在使用pandas,并且希望抑制所有浮点的科学符号,则另一个选项是调整pandas选项

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
从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
输入,因此强制转换。

以上大多数答案都要求您指定精度。但是,如果您希望像这样显示浮动,并且不带不必要的零,该怎么办

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001
numpy
有一个答案:


一种更简单的解决方案,将浮点显示为任意数量的有效数字。此处不需要
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))

对于小于1e-6E的值,它会使用科学符号。我建议您澄清您的陈述,说“您自己管理精度的显示”。实际(Python内部)精度不会改变,就像其他语言中经常做的那样。这真的是您想要的吗?我不:
>>打印({:f})。格式(0.000000123))
0.000000
@您可能需要指定精度<代码>“{0:.10f}”如果您试图打印值列表,也无法运行。我们需要一个全局格式设置。如何在指定有效数字的同时做到这一点?我想通过使用一个变量,给它指定所需的位数,并使用它来代替文字数字,例如
f“{a:.{precision}f}”
你怎么知道精度要用什么值呢?
time.time()#shortStuff end=time.time()打印({.20}.format(end-start),“sec”)
令人失望的是,这里的答案都没有解决这个问题。如果有一种方法可以阻止python(3)使用科学符号,除非明确指定。所有答案都要求用户显式禁止使用科学符号,这与一般禁止在python中隐式使用科学符号不同。是的,就像R在

import numpy as np

def format_float(num):
    return np.format_float_positional(num, trim='-')
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))
for power in range(-8,8):
    num = math.pi * 10**power
    print(str(num).ljust(25), sig(num))