Elixir中的模运算符

19

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

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

5 % 2 == 0

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


3
好的,我会尽力为您提供准确且易于理解的翻译。以下是需要翻译的内容:https://elixirschool.com/en/lessons/basics/basics/#arithmetic

算术运算符

在 Elixir 中,我们可以使用各种算术运算符来执行基本数学运算。下表列出了可用的算术运算符及其功能:
运算符 功能
+ 加法
- 减法
* 乘法
/ 除法
div 整除
rem 取余数
iex> 10 + 5 15 iex> 10 - 5 5 iex> 10 * 5 50 iex> 10 / 5 2.0 iex> div(10, 5) 2 iex> rem(10, 3) 1注意,在进行除法时,如果两个操作数都是整数,则结果也将是整数。如果您需要浮点数结果,请至少将一个操作数转换为浮点数。
- Roger Lipscombe
1
请注意,“模运算符”是一个不确定的术语,可能有不同的算法,特别是对于负数。请参阅https://en.wikipedia.org/wiki/Modulo_operation-我个人认为Elixir rem 运算符是一个余数运算符,而不是模运算符。 - Penguin Brian
@PenguinBrian 这也是我的理解。因此我加了一个问题,询问它与 Ruby 的模运算符有何不同。但是没有人在他们的答案中提到这一点。欢迎您补充一下。 - dan-klasson
3个回答

26

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

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

来自文档:

  

计算整数除法的余数。

     

rem/2使用截断除法,这意味着结果将始终具有被除数的符号。

     

如果其中一个参数不是整数,或者除数为0,则引发ArithmeticError异常。

与Ruby相比主要的差异似乎是:

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

Ruby:

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

Elixir:

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

Elixir的rem只是使用Erlang的rem,因此这个相关的Erlang问题也可能有用。


7

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

rem(5,2) == 0

该函数返回false

顺便说一下,在Elixir中使用%只是从该行开始注释代码到行末。


3
在Erlang中,%用作注释符号,而在Elixir中则使用#。翻译后请勿添加解释或其他内容。 - Roman Boiko

5

只有在你真正需要模数时才使用它。大多数情况下,你需要的是余数。2除以-5两次,剩下的是-1,而不是1。 - Adam Millerchip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接