14

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

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

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

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

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

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

但这似乎不适用于不使用 scipy 的函数。

4

5 回答 5

8

一种想法是添加from __future__ import print_function(在最顶部)然后覆盖标准打印功能。这是一个非常简单的实现,它打印小数点后正好两位数的浮点数:

def print(*args):
    __builtins__.print(*("%.2f" % a if isinstance(a, float) else a
                         for a in args))

您需要更新输出代码以使用打印功能,但至少它是通用的,而不是在每个地方都需要自定义格式规则。如果要更改格式的工作方式,只需更改自定义print函数。

于 2012-09-15T22:25:24.937 回答
7

您所看到的是十进制浮点数只能用二进制浮点来近似。请参阅浮点算术:问题和限制

您可以在库中放置一个模块级变量,并将其用作第二个参数round()来舍入模块中函数的返回值,但这相当激烈。

如果您使用ipython(我建议交互式使用,比常规解释器好得多),您可以使用 'magic' 函数%precision

于 2012-09-15T21:25:10.223 回答
5

使用 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))
于 2016-07-18T22:43:33.380 回答
0

您可以为您的数字和矩阵结果添加str方法(假设您还没有它们),并使它们始终使用相同的 .format 或 %f。

于 2012-09-15T18:27:08.503 回答
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.
于 2021-04-23T20:53:08.093 回答