前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >'%' 求余还是取模,傻傻分不清楚

'%' 求余还是取模,傻傻分不清楚

作者头像
用户5397975
发布2019-10-13 14:48:32
3.6K0
发布2019-10-13 14:48:32
举报
文章被收录于专栏:咖啡拿铁咖啡拿铁

背景

很多同学看见我的这个标题,不禁会说到:你这个是在逗我么,求余和取模不是一回事吗?是的再前不久之前我和你们的感受一样,求余和取模难道不是一个玩意?直到有一天有一个群友再阅读RokcetMq源码的时候,发现了下面一段代码:

代码语言:javascript
复制
private static int initValueIndex() {
       Random r = new Random();

       return Math.abs(r.nextInt() % 999) % 999;
   }

大家可以发现这里求个余数为什么会用两次求余呢?这个问题也作为issue提到了github上,官方人员也只说了这个的确不优雅,可以优化。

虽然官方人员的回答比较搪塞,但是我们还是要本着追根溯源的思想,挖掘出这么写的本来的缘故是什么。

求余还是取模

我们仔细看上面的代码发现使用了Math.abs,这个函数代表取绝对值,那就意味着和符号有关系,虽然这里的r.nextInt不可能为负数,可能当时的开发人员理解这个函数可能会出现负数(实际上r.nextInt不会出现负数)于是进行了取绝对值。

那这个又和我们的标题 求余和取模有什么关系呢? 别着急我们先来看下面的一个公式:

1.求整数商: c = a/b;

2.计算模或者余数: r = a - c*b.

不论是求余和取模都是使用这两个公式进行计算,但是他们在第一步求整数商的时候却不同,求余运算在取c值的时候向0方向舍入,取模运算在计算c值的时候,向无穷小方向舍入,这里要注意的是求余运算不是向无穷大舍入,为什么呢,因为在a和b符合都一致的时候,他们都会向下取整,但是a,b符号不一样的时候求余就会向上取整,取模就会向下取整,最后就会出现取模运算符和b一致,求余预算会和a一样。

一般来说c,c++,java '%' 号代表都是求余,python是取模。

而我们上面那段代码中作者明显是想实现取模,也就是当b是正数的时候那么取模的值会一直为正。

但是在Java中我们如何实现取模呢?在Math中提供了这个函数Math.floorMod,用于我们进行取模,我们有下面的代码进行验证:

代码语言:javascript
复制
    public static void main(String[] args) {
        System.out.println("取模" + Math.floorMod(3, -5));
        System.out.println("求余" + 3 % -5);
    }
    取模-2
    求余3

可以看见输出和我们预期相符。

总结

虽然'%'是求余还是取模在我们大多时候都不需要过于关注,即使关注了可能也对我们的技术帮助不了太多。但是这个'%'的含义肯定有很多人一直是把他们混用在一起的,这里帮助大家做一些科普,希望大家以后看见这个符号的含义能清晰的辨别。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 咖啡拿铁 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 求余还是取模
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档