Swift中500 % 30运算返回20的原因是什么?
关于Swift中正整数模运算的计算逻辑
代码输出的结果完全符合Swift模运算符的设计规则,核心认知偏差来自对模运算绑定的整数除法取商逻辑的误解:
- 模运算的固定计算规则
对任意两个正整数,模运算的结果永远和同操作数下的整数除法结果严格绑定,等价计算公式为:a % b = a - (b * (a / b))
其中a / b是对应整数类型的除法结果,不是浮点数除法结果,也不是人为预估的商值。 - 套入你写的代码计算验证
你已经观察到500 / 30作为整数除法的结果是16,按公式推导:- 先计算商和除数的乘积:
16 * 30 = 480 - 再用被除数减去这个乘积,得到的差值就是模运算的返回结果:
500 - 480 = 20
这个结果和代码实际打印的20完全一致。
- 先计算商和除数的乘积:
- 认知偏差拆解
计算时容易错把不存在的商值作为估算基准——你已经意识到30根本没法在500里凑出20份,却没把取余的计算基础和实际观察到的整数除法结果(16)绑定起来。
实际上整数除法在选择商值时,只会取小于浮点数计算结果的最大整数:500 / 30的浮点数结果约为16.67,小于这个值的最大整数就是16,20本身远大于16.67,根本不可能被选为整数除法的商值。
换个更直观的判断逻辑:小于500的、能被30整除的最大数值是480,500和480的差值就是20。取余的本质就是从被除数里尽可能多的拿走完整的除数份数之后,剩下来的不够再凑出一份除数的数值。
内容的提问来源于stack exchange,提问作者jack-dunn
相关产品推荐
相关产品推荐

