爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 13804|回复: 2

[经验总结] np.round()函数的注意点

[复制链接]

新浪微博达人勋

发表于 2021-8-12 21:11:10 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
今天干活的时候要用到np.round()函数,这是一个很好用的对浮点数舍弃指定小数位的函数,但是有一点要注意一下,否则可能会影响你的结果。
在该函数的早期版本使用的是大家最为常用的“四舍五入”规则,这个规则很好懂,这里不再赘述。不过要提醒的是对负数进行操作时是先取绝对值,再按摄入规则处理,最后再将其变为负数。

本帖中想要强调的是,新版本的np.round()函数使用的进位规则为“四舍五入”的改良版,即“四舍六入五配偶”或者“四舍六入五成双”(此时单身狗受到一万点伤害hhhhh),这点我在高中物理课和本科大学物理实验时听老师讲过,确实是比“四舍五入”规则要更精确些。

“四舍六入五配偶”的含义就是:
当被舍去位的最高位的数字为0-4时即被直接舍去,此即“四舍”。
当被舍去位的最高位的数字为6-9时即向前进位后舍去,此即“六入”。
而最麻烦的是“五配偶”,五凑偶具体解释是:看这个5后面还有没有非0数字,如果没有,就是奇进偶不进;如果有非0数字,不管5前面是奇数还是偶数,都进1。
以保留两位小数为例,像6.5450的千分位的5,它后面数字都是0,它前面数字是4,所以不进1,结果为6.54;而像6.54501这个数字千分位的5,后面有非0数字1,5前面是4,是偶数,所以进1,结果为6.55;同样,如果是6.53501,5前面是5,是奇数,也应该进1,结果为6.54。
代码如下:
a = np.array([6.5450, 6.54501, 6.53501, 1.0251, 2.6556, 20.0251, 20.0250, -45.006])
print(a)
a = np.round(a, decimals=2, out=None)
print(a)

运行结果为:
[  6.545     6.54501   6.53501   1.0251    2.6556   20.0251   20.025    -45.006  ]
[  6.54   6.55   6.54   1.03   2.66  20.03  20.02 -45.01]

这个注意点虽然比较细微,但有些场合下可能会影响结果,比如有些项目要求就使用纯粹的“四舍五入”规则,这时就要注意了!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-8-13 09:23:47 | 显示全部楼层
遇到纯粹“四舍五入”的项目时,应该怎么处理这个情况呢?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-8-13 10:41:59 | 显示全部楼层
cp123546 发表于 2021-8-13 09:23
遇到纯粹“四舍五入”的项目时,应该怎么处理这个情况呢?

可以自己写个函数,很简单的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表