为何浮点数对更大整数取余返回自身?Ruby技术问询
关于Ruby中浮点数取余的疑惑解答
嘿,作为曾经也踩过这个坑的Ruby新手,我太懂你的困惑了!一开始我也纳闷为啥2.5 % 5会返回2.5而不是预期的0,后来查了Ruby的运算规则才搞明白——这其实是因为Ruby里的%运算符实现的是模运算(modulo),不是我们小学学的整数除法里的“余数”逻辑。
要搞清楚这个结果,得先记住Ruby模运算的计算公式:
a % b = a - (b * (a / b).floor)
这里的floor是向下取整的意思,不管结果是正还是负,都往更小的整数方向取。
我们把你的例子代入公式算一遍:
a = 2.5,b = 5- 先算
a / b:2.5 / 5 = 0.5 - 对
0.5向下取整:(0.5).floor = 0 - 最后计算:
2.5 - (5 * 0) = 2.5
这就是为什么你得到的结果是2.5啦!你之前的理解误区在于,把“除法能除尽所以余数为0”的整数逻辑套到了浮点数的模运算上,但模运算的核心是找到不大于被除数的最大的除数倍数,再用被除数减去这个倍数。当被除数小于除数的时候,这个最大的倍数就是0,所以模运算结果自然就是被除数本身。
再举几个例子帮你巩固:
3.8 % 6→ 按照公式计算,3.8/6≈0.633,向下取整是0,结果就是3.85 % 2.5→5/2.5=2,向下取整是2,5 - (2.5*2)=0,这时候结果就是你预期的0
简单来说,Ruby的%运算规则是统一的:不管是整数还是浮点数,都遵循模运算的向下取整逻辑,而不是看除法是否能得到整数商。
内容的提问来源于stack exchange,提问作者Javad Moradi
相关产品推荐
相关产品推荐

