如何在Python中抑制科学记数法?

时间:2009-03-18 15:27:22

标签: python floating-point

这是我的代码:

x = 1.0
y = 100000.0    
print x/y

我的商数显示为1.00000e-05

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

14 个答案:

答案 0 :(得分:56)

使用较新版本''.format(还要记住指定要显示的.之后的数字,这取决于浮点数的小数)。见这个例子:

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

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

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

更新

从Python 3.6开始,可以使用新的formatted string literal简化,如下所示:

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

答案 1 :(得分:47)

'%f' % (x/y)

但你需要自己管理精度。如,

'%f' % (1/10**8)

仅显示零 details are in the docs

或者对于Python 3 the equivalent old formattingnewer style formatting

答案 2 :(得分:46)

使用较新版本的Python(2.6及更高版本),您可以使用''.format()来完成@SilentGhost建议的内容:

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

答案 3 :(得分:4)

这适用于任何指数:

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 :(得分:4)

这是使用Captain Cucumber's answer,但增加了2个。

1)允许函数得到非科学记数字并按原样返回它们(所以你可以抛出一些输入,其中一些数字是0.00003123 vs 3.123e-05并且仍然有功能。

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

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

答案 5 :(得分:1)

除了SG的答案,您还可以使用Decimal模块:

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

# x is a string '0.0001'

答案 6 :(得分:1)

如果是string,则使用其上的内置float进行转换,例如: print( "%.5f" % float("1.43572e-03")) 回答:0.00143572

答案 7 :(得分:0)

使用3.6.4,我遇到了一个类似的问题,输出文件中的数字在使用时会用科学记数法格式化:

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

我必须做的就是添加&#39; f&#39;:

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

答案 8 :(得分:0)

由于这是Google的最佳搜索结果,因此在找不到解决方案后,我将在此处发布。 如果要格式化浮动对象的显示值并使之保持浮动(而不是字符串),则可以使用以下解决方案:

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

from builtins import float
class FormattedFloat(float):

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

您可以通过更改{:f}

中的整数值来自己修改精度。

答案 9 :(得分:0)

如果您使用的是熊猫并且想抑制所有浮标的科学计数法,则另一种选择是调整熊猫选项。

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

答案 10 :(得分:0)

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

precision计算的目的是确保我们具有足够的精度,以免超出科学计数法(默认精度仍为6)。

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

n确实需要float输入,因此需要强制转换。

答案 11 :(得分:0)

上面的大多数答案都要求您指定精度。但是,如果要显示这样的浮点数,而没有不必要的零,该怎么办:

function f1([ref]$out){
    $out.GetType()
    $out
}

$refvar = 'junk'
f1([ref]$refvar)

# Output

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
False    False    PSReference`1                            System.Management.Automation.PSReference

Value : junk

1 0.1 0.01 0.001 0.0001 0.00001 0.000001 0.000000000001 有一个答案:np.format_float_positional

numpy

答案 12 :(得分:0)

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

答案 13 :(得分:0)

您可以使用内置的 format 函数。

>>> a = -3.42142141234123e-15
>>> format(a, 'f')
'-0.000000'
>>> format(a, '.50f') # Or you can specify precision
'-0.00000000000000342142141234122994048466990874926279'