【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





相关文章
|
2月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
170 1
|
2月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
265 1
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
162 0
|
3月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
269 101
|
3月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
214 99
|
3月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
187 98
|
2月前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
122 1
|
3月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
682 19
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
287 102
|
3月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
314 104

推荐镜像

更多