lib/math.ex

defmodule Math do
  @max_precision :math.pow(10, 9)

  def get_precision(point), do: do_get_precision(point, 1)

  defp do_get_precision(point, e) do
    base = round(point * e)

    if base / e != point and e < @max_precision do
      do_get_precision(point, e * 10)
    else
      e
    end
  end

  def int_with_precision(point, precision) do
    round(point * precision)
  end

  def float_with_precision(point, precision) do
    point / precision
  end

  def encode_precision(precision) do
    :math.ceil(:math.log(precision) / :math.log(10))
  end

  def decode_precision(precision) do
    :math.pow(10, precision)
  end
end