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