Kotlin负模数返回负值

Dam*_*tes 4 modulo kotlin mod

Kotlin中,我看到函数a.mod(n)if a为负数,结果为负数.这不是什么模数是要做的.我能做些什么来保持积极的模数?

例如:

(-2).mod(9)
Run Code Online (Sandbox Code Playgroud)

回来-2,应该是7.

tre*_*ell 14

最好的答案是Math.floorMod()Paul Lammertsma 在评论中提到的,因为它在数学上是最正确的:它总是返回零(包含)和除数(不包含)之间的值,并且无论其中一个或两个参数是否为负,都会返回。

它甚至在翻转所有输入和输出的符号时都是不变的:

Math.floorMod(11, 9) => 2
Math.floorMod(-11, -9) => -2

Math.floorMod(-11, 9) => 7
Math.floorMod(11, -9) => -7
Run Code Online (Sandbox Code Playgroud)

Math.floorMod 自 JDK 1.8 起可用。


sba*_*ski 12

在 Kotlin 1.5 中,行为发生了变化,(-11).mod(9) == 7正如 OP 所期望的那样。一般来说, 的结果将与除数mod具有相同的符号。

注意运算符%仍然是rem,所以(-11) % 9 == -2

来源:https ://blog.jetbrains.com/kotlin/2021/04/kotlin-1-5-0-rc-released/


Dam*_*tes 6

在版本中,kotlin 1.1 mod已被弃用,因为它正在计算除法的余数,这可能是负数.这就是为什么他们改变了rem,更类似于它的功能.如果你想在Kotlin和大多数语言中使用模数函数,你可以使用:

r = (a).rem(n)
if (r < 0) r += n
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案不处理“(-11).rem(9)”的情况,因为它仍然返回“2”而不是“7”。最好使用 Math.floorMod() 。 (2认同)