如何在 Python 中对数字进行四舍五入

2024 年 08 月 29 日 | 阅读 9 分钟

现在是大数据时代,每天都有新公司试图利用其信息做出更好的选择。许多企业正在使用 Python 强大的数据科学环境来分析其数据,这表明 Python 在数据分析领域日益突出。

每个数据科学家都应该了解数据集可能被扭曲的方式。基于有偏差的数据得出的结论可能会导致代价高昂的错误。

偏差可以通过多种方式进入数据集。如果我们正式学习过统计学,我们肯定会知道报告偏差、样本偏差和选择偏差等术语。在处理定量数据时,另一个需要考虑的关键偏差是舍入偏差。

内置的 round() 函数

Python 中的 round() 方法接受两个数值输入 n 和 ndigits,它返回给定 n 四舍五入到 ndigits 的数字。由于 ndigits 选项默认设置为零,省略它会得到一个四舍五入到最接近整数的值。正如您将看到的,round() 并不总是按预期运行。

假设我们希望将一个数字四舍五入到最接近的 4.5。该数字将四舍五入到最接近的整数 5。而数字 4.74 将被缩减为一位小数,得到 4.7。

当处理具有多个小数位的浮点数时,快速轻松地四舍五入数字至关重要。Python 函数 round() 使事情变得简单明了。

语法

参数

  1. 数字: 这是将要四舍五入的数字
  2. 位数(可选): 给定数字应四舍五入到的位数。

代码

输出

17
24
7.46584
7.4779
7.47377

在某些情况下,round() 函数的行为不如预期。

代码

输出

2
2
2

round() 算法将 1.5 四舍五入到 2,将 2.5 四舍五入到 2。这不是错误;这是 round() 算法的工作方式。

截断小数

截断是通过将数字缩减到特定小数位数来四舍五入的最简单方法之一。在此算法中,特定位置之后的每个数字都替换为 0。truncate() 函数适用于正值和负值。

我们可以使用以下方法创建截断函数

  1. 通过将给定数字乘以 10 的 p 次幂,将小数点向右移动 p 位。
  2. 使用 int() 获取更新数字的整数部分。
  3. 除以 10p,将小数点向左移动 p 位。
截断到结果
14.952十位10
14.952个位14
14.952十分位14.9
14.952百分位14.95

代码

输出

56.0
-7.3
8.52
530.0
-50000.0

trunc() 方法,通常称为截断函数,是一个 Python Math 函数,它从表达式中删除小数位并返回整数结果。因为此函数是 Python math 包的一部分,所以我们必须导入 math 才能使用它。

语法

此操作只有一个参数。在这种情况下,数字可以是正数也可以是负数。

代码

输出

Truncated number is:  45

向上取整

另一种方法是“向上取整”,它涉及将值四舍五入到特定位数。例如

向上取整到结果
46.345十位50
46.345个位47
46.345十分位46.4
46.345百分位46.35

在数学中,术语“上限”通常用于描述大于或等于某个数字的最接近的整数。在本教程中,我们将使用 2 个函数来“向上取整”,即 ceil() 函数和 math() 运算。

在两个连续整数之间存在一个非整数值。考虑值 6.2,它将介于 6 和 7 之间。上限是区间的上端点,而下限是其下端点。因此,6.2 的上限是 7,而 6.2 的下限是 6。

Python 的 math.ceil() 方法用于应用上限方法。它通常返回大于或等于给定数字的最接近的整数。

代码

输出

Ceiling for 6.2:  7
Ceiling for 6:  6
Ceiling for -0.8:  0

让我们关注使用 round_up() 函数执行“向上取整”方法的代码

我们可以使用以下方法创建向上取整函数

  1. 首先,将 num 乘以 10 ** decimal_place;num 的小数位向右移动适当的位数。
  2. 使用 math.ceil() 模块,将结果数字向上取整到最接近的整数。
  3. 最后,通过将结果数字除以 10 ** decimal_place,将小数位推回左侧。

代码

输出

6.0
5.8
5.25
50.0
800.0

向上取整通常将值沿数轴向右移动,而向下取整通常将值向左移动。

向下取整

我们有一种称为向下取整的方法,它类似于向上取整。

向下取整到结果
46.345十位40
46.345个位46
46.345十分位46.3
46.345百分位46.34

在 Python 中,我们可以使用与截断或向上取整相同的机制向下取整。我们必须首先移动小数点,然后对整数进行四舍五入。最后,返回小数点。

一旦小数点移动,就可以使用 math.ceil() 来向上取整。要“向下取整”,我们必须在小数点移动后先对结果数字的下限进行四舍五入。

math.floor() 提供小于或等于特定数字的最小整数。

代码

输出

Floor value for 6.2:  6
Floor value for 6:  6
Floor value for -0.8:  -1

我们可以使用以下方法来实现向下取整函数

  1. 首先,通过将 n 乘以 10 ** decimal place,num 中的小数位向右移动适当的位数。
  2. 使用 math.floor,结果数字向上取整到最接近的整数 ()。
  3. 最后,通过将结果数字除以 10 ** decimals,将小数位推回左侧。

代码

输出

4.0
3.7
-6.0

舍入偏差

有三种舍入技术:truncate()、round_down() 和 round_up()。当谈到保持特定数字可接受的精度水平时,所有这 3 种策略都非常基本。

truncate()、round_down() 和 round_up() 之间有一个关键区别,这显示了舍入的一个关键组成部分:关于零对称。

请记住,round_up() 在零附近是非对称的。在数学中,如果对于任何 n 值,函数 f(n) 均关于零对称,则 f(n) + f(-n) = 0。例如,向上取整(5.5) 返回 6,而向上取整(-5.5) 返回 -5。round_down() 和 round_up() 函数均不对称于 0。

相反,truncate() 方法在零附近是对称的。这是因为 truncate() 在将小数位置向右移动后会删除剩余的数字。当原始数字为正时,这相当于将值向下推。负数则向上取整。因此,truncate(5.5) 得到 5,而 truncate(-5.5) 得到 -5。

舍入偏差的概念由对称性原理引入,该原理概述了舍入如何影响数据集中的数值。

由于数字在正无穷方向上不断向上取整,“向上取整”方法对正无穷表现出偏差。同样,“向下取整”技术对负无穷具有偏差。

对于正数,“截断”技术对负无穷具有偏差,而对于负数,它对正无穷具有偏差。通常,具有这种趋势的舍入算法被认为具有趋向于零的偏差。

让我们看看它在实践中是如何工作的。以下面的浮点数列表为例

让我们使用 statistics.mean() 函数计算 numeric_values 的平均值。

代码

输出

original mean:  0.93875

现在,使用列表推导式执行 truncate()、round_down() 和 round_up(),将 numeric_values 列表中的每个数字四舍五入到一个小数位,并计算修订后的平均值

代码

输出

[3.6, -5.3, 1.0, -2.6, 8.3, -9.4, 6.4, 5.9]
Rounded up mean:  0.9875000000000002
Rounded dwn mean:  0.8874999999999998
Truncated mean:  0.9249999999999998

当 numeric_values 中的值向上取整时,修订后的平均值分别为 0.98、0.88 和 0.924。向下取整将平均值降低到大约 0.887。截断数字的平均值约为 0.924,最接近原始平均值。

这并不是说我们必须在舍入不同值时截断,同时保持平均值尽可能接近。结果是正数和负数的比例接近 1。在一组所有正数上,truncate() 方法将类似于 round_up(),而在所有负数上,它将类似于 round_down()。

此实例演示了舍入偏差对从舍入数据生成的数字的影响。在从舍入数据进行推断时,我们需要考虑这些结果。

在舍入时,我们通常希望舍入到具有特定精度的最接近的数字,而不是仅仅向上或向下舍入。

如果我们被要求将数字 2.63 和 2.68 四舍五入到最接近的小数位,我们很可能会回答 2.6 和 2.7。truncate()、round_down() 和 round_up() 方法都没有做类似的事情。

注意事项

收集数据完成后再进行舍入

如果我们要处理大量信息,存储可能会成为一个挑战。例如,在工业炉中,温度监测器将用于每二十秒记录温度到八位小数。这些值将有助于避免可能导致任何热源或元件故障的过度振荡。使用 Python 脚本,我们可以检查测量值并查找大的波动。

由于每天都会进行测量,因此会有大量测量值。保留 3 位小数的精度是一个选项。但是,消除太多特异性可能会导致计算发生变化。如果空间足够,我们可以轻松地以完整的精度存储所有数据。当容量有限时,最好始终保留至少 2 或 3 位小数的精度。

最后,一旦我们计算出每日平均温度,将值四舍五入到可能的最高精度。

误差减少

在对大型数据集中的数字进行四舍五入以进行复杂计算时,最重要的事情是记住错误不会增加。