python3 四舍五入及向上向下取整的方法

python

Python自带一个round函数可以截取数位,但在某些情况下精度不够,无法满足使用。

因为在Python 3里面,round对小数的精确度采用了四舍六入五成双的方式。

如果你写过大学物理的实验报告,那么你应该会记得老师讲过,直接使用四舍五入,最后的结果可能会偏高。所以需要使用奇进偶舍的处理方法。

例如对于一个小数a.bcd,需要精确到小数点后两位,那么就要看小数点后第三位:

如果d小于5,直接舍去
如果d大于5,直接进位
如果d等于5:
  d后面没有数据,且c为偶数,那么不进位,保留c
  d后面没有数据,且c为奇数,那么进位,c变成(c + 1)
如果d后面还有非0数字,例如实际上小数为a.bcdef,此时一定要进位,c变成(c + 1)

关于奇进偶舍,有兴趣的同学可以在维基百科搜索这两个词条:数值修约和奇进偶舍。

所以,round给出的结果如果与你设想的不一样,那么你需要考虑两个原因:

你的这个小数在计算机中能不能被精确储存?如果不能,那么它可能并没有达到四舍五入的标准,例如1.115,它的小数点后第三位实际上是4,当然会被舍去。
如果你的这个小数在计算机中能被精确表示,那么,round采用的进位机制是奇进偶舍,所以这取决于你要保留的那一位,它是奇数还是偶数,以及它的下一位后面还有没有数据。

 

如何正确进行四舍五入

如果要实现我们数学上的四舍五入,那么就需要使用decimal模块。

deciaml中有多种舍入模式

舍入模式
decimal.ROUND_CEILING
舍入方向为 Infinity。

decimal.ROUND_DOWN
舍入方向为零。

decimal.ROUND_FLOOR
舍入方向为 -Infinity。

decimal.ROUND_HALF_DOWN
舍入到最接近的数,同样接近则舍入方向为零。

decimal.ROUND_HALF_EVEN
舍入到最接近的数,同样接近则舍入到最接近的偶数。

decimal.ROUND_HALF_UP
舍入到最接近的数,同样接近则舍入到零的反方向。

decimal.ROUND_UP¶
舍入到零的反方向。

decimal.ROUND_05UP
如果最后一位朝零的方向舍入后为 0 或 5 则舍入到零的反方向;否则舍入方向为零。

使用方法

from decimal import Decimal, ROUND_CEILING

python;gutter:true;">sss = \'2.3267\'

sst = \'2.3261\'

rounded_decimal1 = Decimal(sss).quantize(Decimal(\'1.000\'), rounding=ROUND_CEILING)

rounded_decimal2 = Decimal(sst).quantize(Decimal(\'1.000\'), rounding=ROUND_CEILING)

  结果为:

2.327

2.327

 

其余模式自行测试

 

以上是 python3 四舍五入及向上向下取整的方法 的全部内容, 来源链接: utcz.com/z/387146.html

回到顶部