lib/tx_build/utils.ex

defmodule Stellar.TxBuild.Utils do
  @moduledoc """
  TxBuild utils functions.
  """
  @type fraction :: {integer(), integer()}

  @spec number_to_fraction(number :: number()) :: fraction()
  def number_to_fraction(number) when is_integer(number), do: {number, 1}

  def number_to_fraction(number) when is_float(number) do
    precision = float_precision(number)
    base = :math.pow(10, precision) |> trunc()

    numerator = trunc(number * base)
    denominator = 1 * base
    gcd = Integer.gcd(numerator, denominator)

    {div(numerator, gcd), div(denominator, gcd)}
  end

  @spec float_precision(number :: float()) :: integer()
  defp float_precision(number) do
    number
    |> Float.to_string()
    |> String.split(".")
    |> List.last()
    |> String.length()
  end
end