设置全局输出精度python

时间:2012-09-15 17:57:25

标签: python formatting

我编写了一个函数库,使我的工程作业更容易,并在python解释器中使用它们(有点像计算器)。一些返回矩阵,一些返回浮点数。

问题是,它们返回太多小数。例如,目前,当一个数字为0时,我得到一个非常小的数字作为回报(例如6.123233995736766e-17)

我知道如何单独格式化输出,但这需要为我在解释器中输入的每一行添加格式化程序。我正在使用python 2.6。

有没有办法为会话设置全局输出格式(精度等)?

*注意:对于scipy函数,我知道我可以使用

scipy.set_printoptions(precision = 4, suppress = True)

但这对于不使用scipy的函数似乎不起作用。

5 个答案:

答案 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.