【问题标题】:Modulo operator in ElixirElixir 中的模运算符
【发布时间】:2019-02-20 16:03:17
【问题描述】:

如何在 Elixir 中使用模运算符?

例如在 Ruby 中你可以这样做:

5 % 2 == 0

它与 Ruby 的模运算符有何不同?

【问题讨论】:

  • 请注意,“模运算符”是不明确的术语,可以有不同的算法,尤其是对于负数。请参阅 en.wikipedia.org/wiki/Modulo_operation - 我个人认为 elixir rem 运算符是余数运算符,而不是模运算符。
  • @PenguinBrian 这也是我的理解。因此,为什么我添加了它与 Ruby 的模运算符有何不同的问题。但没有人在他们的回答中提到这一点。随意添加一个。

标签: elixir modulo


【解决方案1】:

对于整数,使用Kernel.rem/2:

iex(1)> rem(5, 2)
1
iex(2)> rem(5, 2) == 0
false

来自文档:

计算整数除法的余数。

rem/2 使用截断除法,这意味着结果总是 有dividend的标志。

如果其中一个参数不是 整数,或者divisor 为 0 时。

与 Ruby 相比的主要区别似乎是:

  1. rem 仅适用于整数,但 % 会根据数据类型完全改变其行为。
  2. Elixir 中负股息的符号为负(与 Ruby 的 remainder 相同):

鲁比:

irb(main):001:0> -5 / 2
=> -3
irb(main):002:0> -5 % 2
=> 1
irb(main):003:0> -5.remainder(2)
=> -1

灵药:

iex(1)> -5 / 2
-2.5
iex(2)> rem(-5, 2)
-1

Elixir 的 rem 只是使用 Erlang 的 rem,所以 this related Erlang question 也可能有用。

【讨论】:

    【解决方案2】:

    使用rem/2 参见:https://hexdocs.pm/elixir/Kernel.html#rem/2 因此,在 Elixir 中,您的示例变为:

    rem(5,2) == 0
    

    返回false

    顺便说一句,您在 Elixir 中使用 % 编写的内容只是在行尾开始注释。

    【讨论】:

    • % 在 Erlang 中开始评论,而不是在 Elixir 中。 Elixir 为此使用了#
    【解决方案3】:

    使用Integer.mod/2,参见:https://hexdocs.pm/elixir/Integer.html#mod/2

    iex>Integer.mod(-5, 2)
    1
    

    【讨论】:

    • 只有当你真的想要模数时。大多数时候你想要一个余数。 2 进入 -5 两次,留下 -1,而不是 1。