python 四舍五入

 

强转int会向下取整python

int(2.9),结果为2函数

 

四舍五入就用round( )?Python四舍五入的正确打开方式!

 

round( )函数简介

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

> round( x [, n]  )
  •  

参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。spa

>>> round(2.3)
2
>>> round(2.45, 1)
2.5
  •  

特殊状况

上面的结果并无错误,这里再用2.675测试一下:设计

>>> round(2.675, 2)
2.67
  • 1
  • 2

显然结果不符合四舍五入的规则。为何会这样呢?缘由是:round()函数只有一个参数,不指定位数的时候,返回一个整数,并且是最靠近的整数,相似于四舍五入,当指定取舍的小数点位数的时候,通常状况也是使用四舍五入的规则,可是碰到.5的状况时,若是要取舍的位数前的小数是奇数,则直接舍弃,若是是偶数则向上取舍。code

这也就解释了上述现象。可这样一来用round()函数取浮点数的四舍五入值不就变得不可靠了嘛?这样的函数设计的意义何在?网上搜了一圈答案,以为这个说法比较准确:blog

python3(注意python2 和 3的round()是不同的,这里仅以python3做说明)中round()对浮点数的取舍遵循的是“四舍六入五平分”,“五平分”就是根据取舍的位数前的小数奇偶性来判断,奇偶平分,符合公平性原则(四舍五入不是公平的),这样一来也就保证了在数据量较大的状况下,筛选数据的真实性。(数学渣,不知道这样理解对否……)教程

为何须要平分呢?缘由就是部分小数没法用二进制完整表示,如1.15,转为二进制将是很长的一串数字:1.0010011001100110011001100110011001100110011001100110011 这可不是简单的几个字节就能存放下的。所以这里就出现了取舍的问题。ci

那么正确的四舍五入是否没法实现了呢?固然是有解决办法的。好比,当你须要四舍五入保留两位小数的时候,能够将数值乘以100再除以100.0:数学

>>> round(2.675 * 100)/100.0
2.68
  •  

这样能够解决部分浮点数四舍五入的问题。为何是部分呢?笔者发现:

>>> round(2.135*100)/100.0
2.13
  •  

 

检验下过程:

>>> 2.135*100
213.49999999999997
  • 1

WTF!是精度问题嘛!

>>> Decimal(2.135)*100
Decimal('213.4999999999999786837179272')
  • 1
  • 2

愣住

没法理解是否是!!二进制的世界正常人真的不懂,盼望一下将来有能够直接计算十进制的硬件诞生吧。

总结

在用round()函数进行四舍五入时,若是你对结果有十足把握,而且这就是你想要的结果,那就放心大胆地使用。否则就老老实实写个函数来实现吧,这不是什么难事。

相关文章
相关标签/搜索