Designing Elixir Systems Book Question

On page 23 of the book Designing Elixir Systems With Otp it says “Use div() and rem() to get integer division rather than /.”. For 7/6 gives 1.1666666666666667. How is div and rem better than 7/6?

“Integer division” may be referring to the behaviour of languages like C that do a truncating division on integers.

div / rem are just the way to get that result on the beam.

Still div/rem does not calculate float. So how can it be better in calculating 7/6?

Sometimes I miss the Integer#divmod method in Ruby. Is it possible to add a Kernel.div_rem/2 to Elixir? Something like

iex> {quotient, remainder} = div_rem(7, 3)
{2, 1}

Because Erlang/Elixir is a high-level language. I think higher-level languages should be more “human” than lower-level languages, right? Before you learned programming, what did your math teacher teach you about division?

In C, truncation of the fractional part in integer division is something that needs to be taught, or emphasized, because it’s against our intuition. I think this is why Erlang/Elixir make the / operator always return a float, and make integer division a little bit harder.

It’s not about better or worse, it’s about “for integer division use div/rem, rather than / as the latter simply doesn’t do integer division but always returns a floating point number.”

1 Like

I agree. I’m just wondering why the author of the book would say it’s better to use div/rem for floating point division?

In the paragraph above your quote, we say, “… prefer integers or decimals over floats when you can.” This advice is based on the inaccuracy of floating-point arithmetic. If you want to follow our advice you need to avoid this problem:

iex(1)> 3 / 1
3.0

div/2 is how you do that.

2 Likes

It doesn’t say anything about using div/rem for floating point arithmetic, at least not in the portion you cite. There it just says that you can not use / for integer division…

1 Like

Thanks I got it now.