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


147

这是我的代码:

x = 1.0
y = 100000.0    
print x/y

我的商显示为1.00000e-05

有什么方法可以压制科学记数法并使其显示为 0.00001?我将使用结果作为字符串。


1
1/10000 = 0.0001 = 1.00000e-04
阿德里安·阿彻

@AA,假设它是赋值语句中的错字,我已更正。
Dana

令人失望的是,这里没有答案能解决这个问题。如果有一种方法可以阻止python(3)完全使用科学计数法,除非明确指定,否则会很好。所有答案都要求用户显式地禁止科学计数法,这与从Python内部通常禁止隐式使用科学计数法不同。
BLUC

Answers:



92

使用较新的版本''.format(还请记住指定.要显示的位数,这取决于浮动数字的位数)。请参阅以下示例:

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

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

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

更新资料

从Python 3.6开始,可以使用新的格式化字符串literal简化此过程,如下所示:

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

如何在指定有效数字的同时执行此操作?
Marses

我猜想通过使用一个变量,为它提供所需的位数,然后使用它代替文字数字,例如f"{a:.{precision}f}"
Aziz Alto

49

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

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

1
这真的是您想要的吗?我不会: >>> print('{:f}'.format(0.000000123)) 0.000000
duality_

1
@duality,您可能需要指定精度。'{0:.10f}'
nmichaels

24

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

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


5

这将适用于任何指数:

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

这是使用黄瓜队长的答案,但有2个补充。

1)允许函数获取非科学计数法数字并按原样返回它们(因此,您可以输入很多数字,其中某些数字为0.00003123与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

3

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

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

# x is a string '0.0001'

14
它变成科学记数法为小于1e-6更小的值
SilentGhost

2

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


1

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

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

from builtins import float
class FormattedFloat(float):

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

您可以自己更改精度,方法是更改 {:f}


-1

使用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]))

-1

从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输入,因此需要强制转换。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.