本文深入讲解Python3中 四舍五入、截断保留 与 保留小数位数、取整 ,帮助Python初学者排坑!
总结不易,转载请标明出处:https://blog.csdn.net/weixin_41683971/article/details/105027654
0. 前言(吐槽)
作为一个Python初学者,偶然遇到需要利用Python3进行四舍五入的操作,就想着查一查有没有什么简单快捷的小函数一步到位。这不查不得了,一查就晕倒,网上的帖子和博客漫天飞,闭着眼睛瞎吹的文章一大堆,为了弄懂这一块,费了很多时间和精力。
刚开始很迷,毕竟是个Python小白,咱也不知道人家说的到底对不对,那就多看几个呗,看看咋回事,可谁成想越看越乱。
一开始基本都是“round函数可进行四舍五入运算”,然而我验证了一下发现round压根不行;
又看到有人说用格式控制字符“%.xf”直接就四舍五入到保留位数,emmm就仗着我是小白瞎告诉我呗;
再后来有个稍微好一点的,说用decimal模块的Decimal()+quantize(),还举了俩例子验证了下,emmm还自己把自己给验证错了,还说“原因未知,精度不高,慎用”…
于是我就自己去查了Python3.8.2的官方文档,看了decimal模块和round函数的说明,才恍然大悟。
好了,不多说,上干货!
1. 四舍五入(精确)
1.1 四舍五入并保留x位小数——用decimal模块中的Decimal方法(精度高)
① 数据存储需为字符串型
Decima(a)中的a需要是字符串形式的数字,而不能直接是浮点型数字,因为浮点型数据本身就不是精确的。Why?
假设你输入的是0.1+0.1+0.1,你以为是0.3(是你臆想的十进制运算得到0.3),但在计算机存储中是以二进制浮点数存储的(计算机会自动将你的十进制0.3转化为二进制0.3,但是计算机的二进制存储可不像0.3这么精确),其实它对应的是十进制的0.300000000031或其他,因此并不是精确的。
>>> 0.1 + 0.1 +0.1 == 0.3
False
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
而使用字符串存储输入的数据就可以精确存储输入的数据,即输入是多少输出就是多少。
② 模块及函数引入
导入decimal模块,则调用模块中函数时需用 模块名.函数名(参数) 的形式''
>>> import decimal
>>> a = "1.345"
>>> a_t = Decimal(a).quantize(Decimal("0.01"), rounding = "ROUND_HALF_UP")
>>> print(a_t)
1.35
导入decimal模块中的Decimal函数,则调用时只需用该模块中的 函数名(参数) 的形式
>>> from decimal import Decimal
>>> a = "1.345"
>>> #保留几位小数由像第二个括号中的几位小数决定,即保留两位小数,精确到0.01
>>> #如果想要四舍五入保留整数,那么第二个括号中就应该为"1."
>>> a_t = Decimal(a).quantize(Decimal("0.01"), rounding = "