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

本文探讨了Java中`%`运算符在求余和取模中的区别,通过RocketMQ源码中的一段代码引出问题。在计算公式中,求余在第一步向0方向舍入,取模向无穷小方向舍入。Java中的`%`运算符实际上执行的是求余操作,而`Math.floorMod`函数用于实现取模,确保在正数除数情况下结果始终为正。了解这些细节有助于更准确地理解和使用`%`运算符。
摘要由CSDN通过智能技术生成

背景

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

private static int initValueIndex() {
       Random r = new Random();

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

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

640?wx_fmt=png

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

求余还是取模

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

那这个又和我们的标题 求余和取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值