Search code examples
mathfloating-pointelixirelixir-iex

What is the best way to round a float in elixir


I am trying to round a Float in elixir to 2 decimal places.

If I have the number 12.555, I would like my rounding function to return 12.56

I originally thought that the Float.round was what I wanted but this function does not always return the answer I would like.

For example...

iex()> Float.round(12.555, 2)
12.55

I know that I can get this done with a makeshift function but I thought that there must be a better solution.

My current solution is...

iex()> round(12.555 * 100) / 100
12.56

This does the job but like I said, I just wanted to know if there was a better solution.

Thanks in advance


Solution

  • Because of the way floating point numbers work, if you want precision, including controlling rounding algorithms, you need to use a library such as Decimal:

    12.555
    |> Decimal.from_float()
    |> Decimal.round(2)
    

    Output:

    #Decimal<12.56>
    

    You can then use functions like Decimal.to_string/2 for printing or Decimal.to_float/1, but beware that to_float/1 is also an imprecise operation and could fail.