目录

Python中的四舍五入

在掘金看到一篇文章,讲 Python 中使用 round 函数进行浮点数四舍五入时不够精确的原因,总结一下。

不够精确的原因

对浮点数进行四舍五入不够精确的原因主要有两个:

  1. 在 Python 中浮点数本身不够精确;
  2. round 函数默认采用的数值修约规则是“四舍六入五成双”,不是“四舍五入”;

四舍六入五成双与奇进偶舍

举个例子,对于小数 a.bcd,保留两位小数。

四舍六入五成双

,四舍六入五成双的规则是:

  • 如果 d 小于 5,舍去;
  • 如果 d 大于 5,进位;
  • 如果 d 等于 5,则遵循“奇进偶舍”;

奇进偶舍

如果 d 等于 5:

d 后面没有数字时,需要看 c

  • 如果 c 是奇数,则进一位;
  • 如果 c 是偶数,则舍去。

d 后面还有数字,则无论 c 是奇数还是偶数,都进一位。

解决方案

  1. 针对浮点数表示不够精确的问题,使用 decimal 类型进行精确表示。
  2. 使用 decimal 类型的 quantize 进行运算,并指定数值修约类型为 decimal.ROUND_HALF_UP

注:默认的数值修约方式为 decimal.ROUND_HALF_EVEN,即四舍六入五成双。

1
2
3
4
5
6
7
>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal('0.315').quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
Decimal('0.32')
>>> Decimal('0.325').quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
Decimal('0.33')
>>> Decimal('0.32511').quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
Decimal('0.33')

参考链接