在进行数字剪裁操作时,四舍五入事实上有多种方式,本文记录相关内容以及 Python 实现。
四舍五入 {#四舍五入}
本是很简单的道理,在实际使用过程中发现有些细节上的不同。
标准的四舍五入 {#标准的四舍五入}
-
舍入到整数:
- 如果小数部分小于0.5,则舍去小数部分,保留整数部分。
- 如果小数部分大于或等于0.5,则将整数部分加1。
例如:
- 3.2 四舍五入到整数是 3。
- 3.7 四舍五入到整数是 4。
-
舍入到指定的小数位数:
- 对于需要舍入的位数右侧的第一位数字(即"决定位"),如果它小于5,则舍去它和它右侧的所有数字。
- 如果"决定位"大于或等于5,则舍去它和它右侧的所有数字,并将"决定位"前一位数字加1。
例如:
- 3.141592653589 四舍五入到两位小数是 3.14。
- 3.141592653589 四舍五入到三位小数是 3.142。
特殊的四舍五入 {#特殊的四舍五入}
-
向偶数舍入(Bankers' rounding):
- 当"决定位"恰好是5时,检查"决定位"前一位数字(即"保留位")是奇数还是偶数。
- 如果"保留位"是奇数,则将"保留位"加1(向上舍入)。
- 如果"保留位"是偶数,则舍去"决定位"及其右侧的所有数字(向下舍入)。
例如:
- 2.5 向偶数舍入到整数是 2。
- 3.5 向偶数舍入到整数是 4。
-
向上舍入:
- 不论"决定位"是什么数字,总是将数值舍入到比它大的最接近的整数或小数位数。
例如:
- 2.1 向上舍入到整数是 3。
-
向下舍入:
- 不论"决定位"是什么数字,总是将数值舍入到比它小的最接近的整数或小数位数。
例如:
- 2.9 向下舍入到整数是 2。
Python {#Python}
python 3.11.7 在四舍五入这里实现的很奇怪:
round {#round}
说到 Python 自带的 round 我真的是很无语:
这已经没法用什么四舍五入的规则解释了,整个一个乱搞。
np.round {#np-round}
好一些,不过也有解释不了的事
不知道 5.1为啥就不进到偶数去
decimal {#decimal}
用法稍微复杂一点,但是靠谱的时候多一些:
相对来说靠谱很多,而且提供了四舍五入的选项:
decimal.ROUND_CEILING
:向正无穷大舍入。decimal.ROUND_FLOOR
:向负无穷大舍入。decimal.ROUND_DOWN
:向零舍入。decimal.ROUND_UP
:远离零舍入。decimal.ROUND_HALF_UP
:四舍五入,5进位。decimal.ROUND_HALF_DOWN
:四舍五入,5舍去。decimal.ROUND_HALF_EVEN
:四舍五入,5向最近的偶数舍入。
但是我在一次实验中还是发现了不正确的四舍五入,暂时没有复现,使用的时候还是要多加小心。
文章链接:
https://www.zywvvd.com/notes/coding/python/python-round/pytho-round/