当前位置:脚本大全 > > 正文

python四舍五入怎么用(python3 小数位的四舍五入用两种方法解决round 遇5不进)

时间:2021-10-20 08:39:45类别:脚本大全

python四舍五入怎么用

python3 小数位的四舍五入用两种方法解决round 遇5不进

round( )函数简介

菜鸟教程中介绍到,round() 函数作用就是,返回浮点数x的四舍五入值。

  • ?
  • 1
  • > round( x [, n] )
  • 参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。

  • ?
  • 1
  • 2
  • 3
  • 4
  • >>> round(2.3)
  • 2
  • >>> round(2.45, 1)
  • 2.5
  • 特殊情况

    上面的结果并没有错误,这里再用2.675测试一下:

  • ?
  • 1
  • 2
  • >>> round(2.675, 2)
  • 2.67
  • 显然结果不符合四舍五入的规则。为什么会这样呢?原因是:round()函数只有一个参数,不指定位数的时候,返回一个整数,而且是最靠近的整数,类似于四舍五入,当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的情况时,如果要取舍的位数前的小数是奇数,则直接舍弃,如果是偶数则向上取舍。

    小数位的四舍五入在项目中经常用到,今天群里有人提出1.325 如何才能变成1.33?

    当时我一看这么简单,分秒就可以解决:

    我回复是这样的的

  • ?
  • 1
  • round(1.315,2)
  • 有个小伙伴 当时就回复:

    他要的结果是 1.32, 你打印出是1.31,我看到我想怎么可能呢,我自己运行下,

    结果真是1.31 .

    我想都没有想,自认为我是对的,好吧,怪不得开发不能测试自己的代码.

    我就开始查找原因,我们通过代码进行讲解:

  • ?
  • 1
  • print(decimal(1.325))
  • 打印结果:

    1.3249999999999999555910790149937383830547332763671875

    大家看到了吗? 实际1.325用二进制转化的是有精度损失.部分小数无法完全用二进制表示.
    这是根本所在.

    那有的同学该说了,为什么 有的五能进1 能解释下原理吗?
    原理和上边的一样,我举个例子 5可以进1

  • ?
  • 1
  • 2
  • 3
  • print(round(1.145,2))
  • #打印结果
  • 1.15
  • 继续查看二进制保存的值:

  • ?
  • 1
  • 2
  • 3
  • print(decimal(1.145))
  • #打印结果
  • 1.145000000000000017763568394002504646778106689453125
  • 大家明白了吧 ,round 本身没有问题,而是二进制保存的值有点误差导致的.

    有的同学该说了 那怎么避免这种错误 。

    我准备了两套方案

    1.将数值放大100倍,以利用下面的精确的四舍五入的结果`

  • ?
  • 1
  • 2
  • 3
  • def round_up(value):
  •   # 替换内置round函数,实现保留2位小数的精确四舍五入
  •   return round(value * 100) / 100.0
  • 应用下 看看结果 如何:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • def round_up(value):
  •   # 替换内置round函数,实现保留2位小数的精确四舍五入
  •   return round(value * 100) / 100.0
  •  
  • print(round(1.4))
  •  
  • print(round(1.5))
  •  
  • print(round_up(1.115))
  •  
  • print(decimal(1.115))
  •  
  • #打印结果:
  • 1
  • 2
  • 1.12
  • 1.1149999999999999911182158029987476766109466552734375
  • 看着还不错哦,1.115 居然转化成功了.

    2.decimal.decimal

    四舍五入是基于十进制的,在二进制无法精确表示的时候是会有误差的。

    任何需要十进制运算的地方,都需要用 decimal.decimal 取代 float:

  • ?
  • 1
  • 2
  • from _pydecimal import decimal, context, round_half_up
  • print(context(prec=3, rounding=round_half_up).create_decimal('1.325'))
  • 打印结果:

    1.33

    自己可以试试其他的值,一定都可以进位.

    通过上边的讲解 一定明白 round 本身没有问题,只是float 存储的过程有点误差.

    也可以这么解释:

    这不是bug,而是一种常见的舍入法,名称是“银行家式舍入法”,

    用意是一半舍一半入,如果碰到0.5全入,那么银行觉得自己亏了,

    银行希望和用户要风险对半。不光python,其他的计算机语言都是这个方法,

    例如c语言和basic语言。其实不只是计算机科学,在科学实验的数据处理中,也是采用这种舍入法

    推荐第二种方法, 细心的同学可以发现第一种还是不能完成达到5进,自己可以思考下

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。

    原文链接:https://blog.csdn.net/qq_34979346/article/details/83827044

    上一篇下一篇

    猜您喜欢

    热门推荐