这就是我在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
答案 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有更多相关信息。