【Python 基础教程】彻底解决python round函数的四舍五入不精确的问题

简介: 【Python 基础教程】彻底解决python round函数的四舍五入不精确的问题

前言🥦


在Python官方有这样一句话:The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information也就是说,在Python语言中小数的存储往往是近似值,并不像整数那样精确。我们呢有时候需求就是对小数的指定位数进行四舍五入,今天博主在这里分享一下在Python中进行小数四舍五入的几种方法。如果你也有什么好的方法欢迎评论区留言哦。


一、小数不精确的常见问题🥦


Python中的小数存储往往是不精确的,相加的时候可能会导致精度丢失,或者结果出乎意料。


1.相加🌴


print(1.01+1.02)


7496a14b2b8b471cb104f550eb3f69e7.png


2.四舍五入🌴


以下代码的打印结果

print(round(1.135,2))

print(round(1.235,2))

print(round(1.335,2))

print(round(1.435,2))

print(round(1.535,2))

print(round(1.635,2))

最后的一位数应该都为4,但是由于精度丢失,导致有些数四舍五入失败。


18af565ecec94e258cca5269778eaec9.png


二、round函数🥦


1.简介🌴


官方给出的接口如下:

def round(number: SupportsRound[_T], ndigits: SupportsIndex)


第一个参数指的是需要进行四舍五入的小数,第二个参数是保留的小数位

默认是保留0位小数,也就是保留到整数。


2.使用方法🌴


① 代码🌵:


print(round(1.135,2))
print(round(1.235,2))
print(round(1.335,2))
print(round(1.435,2))
print(round(1.535,2))
print(round(1.635,2))


② 运行结果🌵:


18af565ecec94e258cca5269778eaec9.png


③ 暴露问题🌵:


可以看出来运行结果不是很理想,因为有些数值四舍五入进位失败,我们可以处理一下,然后就可以得到准确的结果了。经过分析当只有一位小数的时候保留到整数,进位比较准确。

代码:

a3c86971e194428ab0c1ec38e6fe271e.png


结果:

0f9727fe496a415d92e27b4a18c67b28.png


④ 解决方法🌵:


我们可以对代码做出这样的改动,也就是利用四舍五入一位小数可以获得精确值的性质

可以先将数值扩大n倍,直到将保留小数位的下一位小数提到小数部分第一位,也就是说保留两位小数就将第三位小数提到第一位,做的操作就是乘以100。依次类推

print(round(1.235,2))
print(round(1.3355*100)/100)
print(round(1.435,2))
print(round(1.5355*100)/100)
print(round(1.635,2))


b822bbc7b6744551b017bfe8963b79c1.png


三、Decimal模块🥦


这是一个精确小数计算的模块,咱们只在这里说一下他的简单使用方法。


1.创建Decimal小数🌴


① 字符串型🌵


代码:


print("Decimal精确的1.35:",Decimal("1.35"))
• 1


运行结果:


4a22a5586f684bfb871d406a4a257b8d.png


② 数值型🌵


代码:


print("float型的1.35",Decimal(1.35))
• 1


运行结果:


a32918aa69e94f7f93b0a237dfc5e756.png


2.结合round函数精确四舍五入🌴


代码:


from decimal import Decimal
print(round(Decimal("1.535"),2))
print(round(Decimal("1.335"),2))


运行结果:



a2b6164a5a244b53b8a506602e2ddcd0.png

3.使用自身方法精确四舍五入🌴


代码:


print(Decimal("1.3355").quantize(Decimal("0.000")))
print(Decimal("1.2955").quantize(Decimal("0.00")))
print(Decimal("1.3355").quantize(Decimal("0.00")))


运行结果:


1524613c331b4f7ebb8af55b0b2572de.png





相关文章
|
12天前
|
存储 Python
SciPy 教程 之 SciPy 稀疏矩阵 4
SciPy 教程之 SciPy 稀疏矩阵 4:介绍稀疏矩阵的概念、类型及其在科学计算中的应用。SciPy 的 `scipy.sparse` 模块提供了处理稀疏矩阵的工具,重点讲解了 CSC 和 CSR 两种格式,并通过示例演示了如何创建和操作 CSR 矩阵。
36 3
|
1天前
|
Python
SciPy 教程 之 Scipy 显著性检验 3
本教程介绍Scipy显著性检验,包括其基本概念、原理及应用。显著性检验用于判断样本与总体假设间的差异是否显著,是统计学中的重要工具。Scipy通过`scipy.stats`模块提供了相关功能,支持双边检验等方法。
7 1
|
4天前
|
机器学习/深度学习 Python
SciPy 教程 之 SciPy 插值 2
SciPy插值教程:介绍插值概念及其在数值分析中的应用,特别是在处理数据缺失时的插补和平滑数据集。SciPy的`scipy.interpolate`模块提供了强大的插值功能,如一维插值和样条插值。通过`UnivariateSpline()`函数,可以轻松实现单变量插值,示例代码展示了如何对非线性点进行插值计算。
7 3
|
6天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 4
本教程介绍了SciPy的空间数据处理功能,主要通过scipy.spatial模块实现。内容涵盖空间数据的基本概念、距离矩阵的定义及其在生物信息学中的应用,以及如何计算欧几里得距离。示例代码展示了如何使用SciPy计算两点间的欧几里得距离。
20 5
|
6天前
|
机器学习/深度学习 Python
SciPy 教程 之 SciPy 空间数据 6
本教程介绍了SciPy处理空间数据的方法,包括使用scipy.spatial模块进行点位置判断、最近点计算等内容。还详细讲解了距离矩阵的概念及其应用,如在生物信息学中表示蛋白质结构等。最后,通过实例演示了如何计算两点间的余弦距离。
15 3
|
5天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 7
本教程介绍了SciPy的空间数据处理功能,涵盖如何使用`scipy.spatial`模块进行点的位置判断、最近点计算等操作。还详细解释了距离矩阵的概念及其在生物信息学中的应用,以及汉明距离的定义和计算方法。示例代码展示了如何计算两个点之间的汉明距离。
10 1
|
8天前
|
Python
SciPy 教程 之 SciPy 图结构 7
《SciPy 教程 之 SciPy 图结构 7》介绍了 SciPy 中处理图结构的方法。图是由节点和边组成的集合,用于表示对象及其之间的关系。scipy.sparse.csgraph 模块提供了多种图处理功能,如 `breadth_first_order()` 方法可按广度优先顺序遍历图。示例代码展示了如何使用该方法从给定的邻接矩阵中获取广度优先遍历的顺序。
19 2
|
9天前
|
算法 Python
SciPy 教程 之 SciPy 图结构 5
SciPy 图结构教程,介绍图的基本概念和SciPy中处理图结构的模块scipy.sparse.csgraph。重点讲解贝尔曼-福特算法,用于求解任意两点间最短路径,支持有向图和负权边。通过示例演示如何使用bellman_ford()方法计算最短路径。
19 3
|
9天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
22 1
|
13天前
|
存储 Python
SciPy 教程 之 SciPy 稀疏矩阵 2
SciPy教程之SciPy稀疏矩阵2:介绍稀疏矩阵的概念、应用场景及scipy.sparse模块的使用。重点讲解CSC和CSR两种稀疏矩阵类型及其常用方法,如data属性和count_nonzero()方法。
38 4