Kotlin负模返回负值

Kotlin负模返回负值,kotlin,modulo,mod,Kotlin,Modulo,Mod,在Kotlin中,我看到对于函数a.mod(n),如果a为负值,则结果为负值。这不是模应该做的。我能做些什么使模始终为正 例如: (-2).mod(9) 返回-2,应该是7 kotlin 1.1版mod中的不推荐使用,因为它正在计算除法的剩余部分,可能是负数。这就是为什么它们改为rem,与它的功能更相似。如果您想在Kotlin和大多数语言中使用模函数,可以使用: r = (a).rem(n) if (r < 0) r += n r=(a).rem(n) 如果(r。当当前索引为零时,您是

Kotlin中,我看到对于函数
a.mod(n)
,如果
a
为负值,则结果为负值。这不是模应该做的。我能做些什么使模始终为正

例如:

(-2).mod(9)

返回
-2
,应该是
7

kotlin 1.1版
mod
中的不推荐使用,因为它正在计算除法的剩余部分,可能是负数。这就是为什么它们改为
rem
,与它的功能更相似。如果您想在Kotlin和大多数语言中使用模函数,可以使用:

r = (a).rem(n)
if (r < 0) r += n
r=(a).rem(n)
如果(r<0)r+=n

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

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

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

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

Math.floorMod
从JDK1.8开始就可以使用。

实际上这里应该是负号,因为这是mod在大多数语言中的工作方式。仅仅因为它很普通并不意味着它是对的。我从来没有想要C++行为,总是想要数学行为。考虑一个非常常见的情况:循环使用一个数组,使用<代码> ARAYOFFEST[CUREX- 1 ] < /代码>。当当前索引为零时,您是希望结束还是抛出异常?此解决方案不处理
(-11).rem(9)
的情况,因为它仍将返回
2
而不是
7
。最好使用
Math.floorMod()
。如果需要,可以将答案编辑为另一个最有效的选项