python round()函数保留小数位数的详细用法及round函数的坑

round(number[, ndigits])
返回number舍入到小数点后ndigits为精度的值,如果ndigits被省略则会返回最接近输入值的整数

强调:round()的舍入规则不是四舍五入
强调:round()的舍入规则不是四舍五入
强调:round()的舍入规则不是四舍五入

舍入的规则
官方定义:结果值会舍入至最接近的 10 的负 ndigits 次幂的倍数;如果与两个倍数同样接近,则选用偶数。
有点不好理解,换一种理解方式
结果值 = 与number 最接近的拥有ndigits位小数的小数 。如果距离相等,则选择小数点第ndigits位是偶数的小数

  • 如果不填ndigits 则保留整数部分 当出现距离相等的情况,则看整数末尾,最后结果靠近整数末尾是偶数的
    round(number)
    number在[1.5,2.5] 的值结果为2 1.5距离1和距离2相等,2是偶数所以结果是2,2.5距离2和距离3相等,2是偶数所以结果是2
    number在 (2.5,3.5) 的值结果为3 在这个范围中的距离3最近所以结果为3
    number=3.5 保留结果为4(3.5距离3和距离4都为0.5 因为4是偶数,所以最后的结果是4)
    在这里插入图片描述
    特别注意:round(0.5) 和 round(-0.5) 均得出 0
  • 如果有指定的ndigit值,则会保留对应的小数位方法和整数的相同
  • 结果值等于和原值小数最接近的拥有ndigits位小数的值,如果距离相等选择小数点第ndigits位是偶数的值
a = 2.465 # 舍入后 2.46     # 距离2.46和2.47一样近,2.46的末尾小数为偶数,则结果为2.46
b = 2.4651  # 舍入后 2.47   # 距离2.47较近
print(round(a,2))
print(round(b,2))

a = 2.464 # 舍入后 2.46   # 距离2.46最近
b = 2.467  # 舍入后 2.47  # 距离2,47最近
print(round(a,2))
print(round(b,2))

round()函数的坑

官方文档的例子

对浮点数执行 round() 的行为可能会令人惊讶:例如,round(2.675, 2) 将给出 2.67 而不是期望的 2.68。
这不算是程序错误:这一结果是由于大多数十进制小数实际上都不能以浮点数精确地表示。

因为所有的数据在计算机中都以二进制的形式进行存储,从十进制转化为二进制的过成中,会有精度的损失。
2.675转换成二进制以后在计算机存储的机器数要小于2.675 所以会导致结果和预期值不一样

如果想要精确度比较高的

  • 使用模块 decimal
    decimal可以调整小数点位数的进度

  • format函数转换成字符串,可以指定保留小数位数,保留规则为四舍五入

猜你喜欢

转载自blog.csdn.net/qq_52007481/article/details/123776922
今日推荐