Q-Logo 我的学习笔记分享

Entries for tag "si-she-wu-ru"

从Python 的round 函数的坑谈四舍五入

对浮点数执行 round ,返回的不是四舍五入的值,而是按以下规则确定的:

  1. 值会被舍入到距离 number 最接近的 10 的负 ndigits 次幂的倍数
  2. 如果 number 与两个倍数的距离正好相等,则选择偶数,即正好在中间时,向偶取整

我们输入和看到的浮点数,与计算机中存储和运算时使用的浮点数未必完全相同,多数时候后者只是前者的近似值。

round(2.675, 2) 返回2.67 而不是 2.68 ,并不是错误,也不是bug,而是使用计算机进行浮点运算必然会出现的现象。

除非对精确度要求比较底,否则尽量避免用round()函数处理浮点小数。

如果确实需要使用四舍五入的方式进行舍入,可以用 decimal 模块:

>>> import decimal

>>> D = decimal.Decimal

>>> decimal.getcontext().rounding = "ROUND_HALF_UP" # 设置舍入方式为四舍五入

>>> D('2.675').quantize(D('0.00'))

Decimal('2.68') # 四舍五入后的值