前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 四舍五入

Python 四舍五入

作者头像
为为为什么
发布2024-08-24 14:04:33
930
发布2024-08-24 14:04:33
举报
文章被收录于专栏:又见苍岚

在进行数字剪裁操作时,四舍五入事实上有多种方式,本文记录相关内容以及 Python 实现。

四舍五入

本是很简单的道理,在实际使用过程中发现有些细节上的不同。

标准的四舍五入
  1. 舍入到整数
代码语言:txt
复制
- 如果小数部分小于0.5,则舍去小数部分,保留整数部分。
- 如果小数部分大于或等于0.5,则将整数部分加1。

例如:

代码语言:txt
复制
- 3.2 四舍五入到整数是 3。
- 3.7 四舍五入到整数是 4。
代码语言:txt
复制
- 对于需要舍入的位数右侧的第一位数字(即“决定位”),如果它小于5,则舍去它和它右侧的所有数字。
- 如果“决定位”大于或等于5,则舍去它和它右侧的所有数字,并将“决定位”前一位数字加1。

例如:

代码语言:txt
复制
- 3.141592653589 四舍五入到两位小数是 3.14。
- 3.141592653589 四舍五入到三位小数是 3.142。
特殊的四舍五入
  1. 向偶数舍入(Bankers’ rounding)
代码语言:txt
复制
- 当“决定位”恰好是5时,检查“决定位”前一位数字(即“保留位”)是奇数还是偶数。
- 如果“保留位”是奇数,则将“保留位”加1(向上舍入)。
- 如果“保留位”是偶数,则舍去“决定位”及其右侧的所有数字(向下舍入)。

例如:

代码语言:txt
复制
- 2.5 向偶数舍入到整数是 2。
- 3.5 向偶数舍入到整数是 4。
代码语言:txt
复制
- 不论“决定位”是什么数字,总是将数值舍入到比它大的最接近的整数或小数位数。

例如:

代码语言:txt
复制
- 2.1 向上舍入到整数是 3。
代码语言:txt
复制
- 不论“决定位”是什么数字,总是将数值舍入到比它小的最接近的整数或小数位数。

例如:

代码语言:txt
复制
- 2.9 向下舍入到整数是 2。

Python

python 3.11.7 在四舍五入这里实现的很奇怪:

round

说到 Python 自带的 round 我真的是很无语:

12345678910111213141516171819202122

round(5.5155555, 6)5.515555>>> round(5.5055555, 6)5.505555>>> round(5.5255555, 6)5.525556>>> round(5.5355555, 6)5.535556>>> round(5.5455555, 6)5.545555>>> round(5.5455555, 6)5.545555>>> round(5.5555555, 6)5.555555>>> round(5.5655555, 6)5.565556>>> round(5.5755555, 6)5.575556>>> round(5.5855555, 6)5.585555>>> round(5.5955555, 6)5.595555

这已经没法用什么四舍五入的规则解释了,整个一个乱搞。

np.round

好一些,不过也有解释不了的事

1234567891011121314151617181920

np.round(5.155555,5)5.15555>>> np.round(5.255555,5)5.25556>>> np.round(5.355555,5)5.35556>>> np.round(5.455555,5)5.45556>>> np.round(5.555555,5)5.55556>>> np.round(5.655555,5)5.65556>>> np.round(5.755555,5)5.75556>>> np.round(5.855555,5)5.85556>>> np.round(5.955555,5)5.95556>>> np.round(5.055555,5)5.05556

不知道 5.1为啥就不进到偶数去

decimal

用法稍微复杂一点,但是靠谱的时候多一些:

1234567891011121314151617181920212223

import decimalfrom decimal import Decimaldecimal.getcontext().prec = 6quant = decimal.Decimal('0.00001')for i in range(10): value_str = '5.0' + str(i) + '55555' value = Decimal(value_str) rounded_value = value.quantize(quant) print(rounded_value) -->5.005565.015565.025565.035565.045565.055565.065565.075565.085565.09556

相对来说靠谱很多,而且提供了四舍五入的选项:

  • 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://cloud.tencent.com/developer/article/2447532

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-8-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 四舍五入
    • 标准的四舍五入
      • 特殊的四舍五入
      • Python
        • round
          • np.round
            • decimal
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档