Answers:
使用较新的版本''.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'
f"{a:.{precision}f}"
使用Python的较新版本(2.6和更高版本),您可以''.format()
用来完成@SilentGhost建议的操作:
'{0:f}'.format(x/y)
>>> print('{:f}'.format(0.000000123))
0.000000
'{0:.10f}'
如果您使用的是熊猫并且想抑制所有浮标的科学计数法,则另一种选择是调整熊猫选项。
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
上面的大多数答案都要求您指定精度。但是,如果要显示这样的浮点数而没有不必要的零,该怎么办:
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='-')
这将适用于任何指数:
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
这是使用黄瓜队长的答案,但有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
除了SG的答案,您还可以使用Decimal模块:
from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))
# x is a string '0.0001'
从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
输入,因此需要强制转换。