如何在Elixir中获取过去十进制的数字?

时间:2017-04-16 10:36:05

标签: elixir phoenix-framework

这就是我在Python中的表现......在Elixir中有更优雅的方式吗?

def get_digits_past_decimal(number):
    number_string = str(number)
    dig_past_decimal = abs(Decimal(number_string).as_tuple().exponent)
    return dig_past_decimal

1 个答案:

答案 0 :(得分:2)

我将float转换为字符串并计算点后的字节数:

一个班轮:

float |> Float.to_string |> String.split(".") |> Enum.at(1) |> byte_size

稍长但效率更高,因为它不会创建中间列表:

string = float |> Float.to_string
{start, _} = :binary.match(string, ".")
byte_size(string) - start - 1

测试:

defmodule A do
  def count1(float) do
    float |> Float.to_string |> String.split(".") |> Enum.at(1) |> byte_size
  end

  def count2(float) do
    string = float |> Float.to_string
    {start, _} = :binary.match(string, ".")
    byte_size(string) - start - 1
  end
end

for f <- [0.1, 0.234, 123.456, 0.0000000001] do
  IO.inspect {A.count1(f), A.count2(f)}
end

输出:

{1, 1}
{3, 3}
{3, 3}
{5, 5}

注意:结果可能与Python不同,因为有多种方法可以将float转换为具有略微不同的输出和权衡的十进制字符串。 This question有更多相关信息。