获取浮点数的浮点/小数部分

时间:2017-05-25 17:50:03

标签: erlang

我想:

unknown_function(123.456) -> 456
unknown_function(1234.56) -> 56

或者

unknown_function(123.456) -> "456"

这是否内置?内置trunc/1反其道而行之:

2> trunc(123.456).
123

C:Extract decimal part from a floating point number in C以及Java的这个答案:How to get the decimal part of a float?

3 个答案:

答案 0 :(得分:1)

没有没有BIF,但你可以这样做:

decimal_point(X, DecimalDigits) when X < 0 ->
  decimal_point(-X, DecimalDigits);
decimal_point(X, DecimalDigits)->
  (X - trunc(X)) * math:pow(10,DecimalDigits).

> decimal_point(2.33, 2).
33
> decimal_point(-2.33, 2).
33

答案 1 :(得分:0)

这是受@ Dogbert评论的启发

由于浮点表示限制和舍入错误,算法无法使用本机浮点数。

但是,使用https://github.com/tim/erlang-decimal

frac_to_denom_int(Num, Denom, Precison) ->
{X, _} = string:to_integer(lists:nth(2, string:tokens(decimal:format(decimal:divide(Num, Denom, [{precision, Precison}])), "."))),
X.

如,

frac_to_denom_int("1.0", "3.0", 1000).
> 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

如果你没有压力,

d_to_denom_int(D_Tup)->
    string:to_integer(lists:nth(2, string:tokens(decimal:format(D_Tup), "."))).

d_to_denom_int({0, 123456, -3}).
 > 456

答案 2 :(得分:0)

根据@ dogbert的评论,在compact电话上再传递一个标记float_to_list/2会有所帮助:

lists:nth(2, string:tokens(float_to_list(123.456, [{decimals, 10}, compact]), ".")).
% "456"

如果你超过小数14,你会开始看到那些舍入错误。