使Java的模量表现得像负数一样的最佳方法?

2022-08-31 08:33:53

在java中,当你这样做

a % b

如果 a 为负,它将返回负结果,而不是像它应该的那样绕到 b。解决此问题的最佳方法是什么?我能想到的唯一方式是

a < 0 ? b + a : a % b

答案 1

它的行为应该 a % b = a - a / b * b;即它是其余的。

你可以做 (a % b + b) % b


这个表达式的工作原理是 结果必然低于 ,无论是正数还是负数。加法处理负值,因为 是 和 之间的负值,必然低于 和 正值。最后一个模是存在的,以防万一开始是正数,因为如果为正数将变大于 。因此,将其变为小于再次(并且不会影响负值)。(a % b)baba(a % b)-b0(a % b + b)baa(a % b + b)b(a % b + b) % bba


答案 2

从Java 8开始,您可以使用Math.floorMod(int x,int y)Math.floorMod(long x,long y)。这两种方法返回的结果与 Peter 的答案相同。

Math.floorMod( 2,  3) =  2
Math.floorMod(-2,  3) =  1
Math.floorMod( 2, -3) = -1
Math.floorMod(-2, -3) = -2