我编写了一个函数库,使我的工程作业更容易,并在python解释器中使用它们(有点像计算器)。一些返回矩阵,一些返回浮点数。
问题是,它们返回太多小数。例如,目前,当一个数字为0时,我得到一个非常小的数字作为回报(例如6.123233995736766e-17)
我知道如何单独格式化输出,但这需要为我在解释器中输入的每一行添加格式化程序。我正在使用python 2.6。
有没有办法为会话设置全局输出格式(精度等)?
*注意:对于scipy函数,我知道我可以使用
scipy.set_printoptions(precision = 4, suppress = True)
但这对于不使用scipy的函数似乎不起作用。
答案 0 :(得分:6)
一个想法是添加from __future__ import print_function
(在最顶部),然后覆盖标准打印功能。这是一个非常简单的实现,可以在小数点后打印正好两位数的浮点数:
def print(*args):
__builtins__.print(*("%.2f" % a if isinstance(a, float) else a
for a in args))
您需要更新输出代码才能使用print函数,但至少它是通用的,而不是每个地方都需要自定义格式规则。如果要更改格式的工作方式,只需更改自定义print
功能。
答案 1 :(得分:4)
您所看到的是十进制浮点数只能通过二进制浮点近似这一事实。请参阅Floating Point Arithmetic: Issues and Limitations。
您可以在库中放置一个模块级变量,并将其用作round()
的第二个参数来舍入模块中函数的返回值,但这是相当激烈的。
如果你使用ipython(我推荐用于交互式使用,很多比常规口译更好),你可以使用“魔法”'函数%precision
。
答案 2 :(得分:2)
使用numpy,您可以使用set_printoptions
方法(http://docs.scipy.org/doc/numpy/reference/generated/numpy.set_printoptions.html)。
例如:
import numpy as np
np.set_printoptions(precision=4)
print(np.pi * np.arange(8))
答案 3 :(得分:0)
您可以为数字和矩阵结果添加 str 方法(假设您还没有它们),并使它们始终使用相同的.format或%f。
答案 4 :(得分:0)
以@Blckknght 解决方案为基础,我们可以使用正则表达式来实现更强大的功能。
import re
round_to = 4
def str_round(match):
return str(round(eval(match.group()), round_to))
def print(*args, **kwargs):
if len(args):
args = list(args)
for i, text in enumerate(args):
text = str(text)
if re.search(r"([-+]?\d*\.?\d+|[-+]?\d+)", text):
args[i] = re.sub(r"([-+]?\d*\.?\d+|[-+]?\d+)", str_round, text)
return __builtins__.print(*args, **kwargs)
现在下面的打印语句中的数字将被四舍五入
>>> print(f"The number {1/3} is in this sentence.")
The number 0.3333 is in this sentence.