python中round的用法,python四舍五入的坑
1、构成round( x [, n] )
参数:
x : 必填,数值表达式;
[, n] : 可选,需要保留的小数位数,默认为0,即默认保留整数位。
2、简单的来看一下用法
round(10/3) #默认保留整数部分,结果为3;
round(10/3, 2) #默认保留2位小数,结果为3.3;
round(10.676, 2) #默认保留2位小数,结果为10.68。

3、但是直接使用round()时,会遇到一些问题,如下:
round(2.675, 2) #正确值应该是2.68,但这里实际返回的是2.67;
round(2.6754, 2) #返回2.68,正确;

4、所以在处理数据的时候,可能会发生一些,我们不能来理解的情况,如:
0.10 + 0.20 # 返回 0.30000000000000004。
这是因为python存储值的时候,是以近似值存储的,在第三位为“0.005”的时候,实际储存的是“0.004999999999”,所以自动舍去了。
有人提出了“奇进偶舍”的概念,但是python3.8实测并不满足,后面提供2种解决办法。

5、方法一 decimal方法:
import decimal as dc # 导入"decimal"模块,并命名为"dc";
from decimal import Decimal as Dc # 导入"decimal"模块中"Decimal"方法,并命名为"Dc";
传入的值需要为字符串:
Dc('2.685').quantize(Dc('0.00'), rounding=dc.ROUND_HALF_UP)
Dc('2.635').quantize(Dc('0.00'), rounding=dc.ROUND_HALF_UP)
Dc('2.685'):为传入的值;
.quantize(Dc('0.00'), rounding=dc.ROUND_HALF_UP)中:
Dc('0.00'):为需要保留的小数位;
rounding=dc.ROUND_HALF_UP:为设定为四舍五入。
可以看到我们传入的值都可以正常处理了。

6、方法二 int方法:
也可以根据int方法直接舍去小数点后数值的特性,我们如果要保留2位小数,就先对数值*100,保留3位就*1000,以此类推,最后再将倍数除掉,来达到四舍五入的目的:
int(2.685*100+0.5)/100 # 返回2.69;
int(2.635*100+0.5)/100 # 返回2.64;
这也是笔者经常使用的方法。
