【问题标题】:Kotlin negative modulo returns negative valueKotlin 负模返回负值
【发布时间】:2018-05-07 09:22:18
【问题描述】:

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

例如:

(-2).mod(9)

返回-2,应该是7

【问题讨论】:

  • 实际上这里应该是负号,因为这就是 mod 在大多数语言中的工作方式。 stackoverflow.com/questions/11630321/…
  • 普通不代表正确。我从不想要 C++ 行为,并且一直想要数学行为。考虑使用arrayOfStuff[curIndex - 1] 在数组中循环的极其常见的情况。当前索引为零时,你是想绕到底还是抛出异常?

标签: kotlin modulo mod


【解决方案1】:

最佳答案是 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 自 JDK 1.8 起可用。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 此解决方案不处理(-11).rem(9) 的情况,因为它仍将返回2 而不是7。最好使用Math.floorMod()
    • 您可以根据需要将答案编辑为其他最有效的选项
    • 这个答案现在有点过时了。从 Kotlin 1.5 开始,mod 按 OP 预期的方式工作。
    【解决方案3】:

    在 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 2012-01-26
      • 2011-07-22
      • 2011-03-05
      • 2018-03-02
      • 1970-01-01
      相关资源
      最近更新 更多