diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index 54a0a80..0dbabda 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -1069,6 +1069,28 @@ b</pre>
       </desc>
     </func>
     <func>
+      <name>float_to_list(Float, Options) -> string()</name>
+      <fsummary>Text representation of a float formatted using given options</fsummary>
+      <type>
+        <v>Float = float()</v>
+        <v>Options = [Option]</v>
+        <v>Option = {precision, Precision::integer()} | compact</v>
+      </type>
+      <desc>
+        <p>Returns a string which corresponds to the text
+          representation of <c>Float</c> using fixed decimal point formatting.
+          When <c>precision</c> option is specified
+          the returned value will contain at most <c>Precision</c> number of
+          digits past the decimal point.  When <c>compact</c> option is provided
+          the trailing zeros at the end of the list are truncated.</p>
+        <pre>
+> <input>float_to_list(7.12, [{precision, 4}]).</input>
+"7.1200"
+> <input>float_to_list(7.12, [{precision, 4}, compact]).</input>
+"7.12"</pre>
+      </desc>
+    </func>
+    <func>
       <name>erlang:fun_info(Fun) -> [{Item, Info}]</name>
       <fsummary>Information about a fun</fsummary>
       <type>
diff --git a/erts/emulator/beam/atom.names b/erts/emulator/beam/atom.names
index 28f69b9..d125472 100644
--- a/erts/emulator/beam/atom.names
+++ b/erts/emulator/beam/atom.names
@@ -138,6 +138,7 @@ atom close
 atom closed
 atom code
 atom command
+atom compact
 atom compat_rel
 atom compile
 atom compressed
@@ -409,6 +410,7 @@ atom pid
 atom port
 atom ports
 atom port_count
+atom precision
 atom print
 atom priority
 atom private
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c
index 506bf38..4be62b5 100644
--- a/erts/emulator/beam/bif.c
+++ b/erts/emulator/beam/bif.c
@@ -2655,6 +2655,51 @@ BIF_RETTYPE float_to_list_1(BIF_ALIST_1)
      BIF_RET(buf_to_intlist(&hp, fbuf, i, NIL));
  }
 
+BIF_RETTYPE float_to_list_2(BIF_ALIST_2)
+{
+    int precision = 4;
+    int compact = 0;
+    Eterm list = BIF_ARG_2;
+    Eterm arg;
+    int i;
+    Uint need;
+    Eterm* hp;
+    FloatDef f;
+    char fbuf[256];
+
+    /* check the arguments */
+    if (is_not_float(BIF_ARG_1))
+	    goto badarg;
+
+    while (is_list(list)) {
+        arg = CAR(list_val(list));
+        if (arg == am_compact)
+            compact = 1;
+        else if (is_tuple(arg)) {
+            Eterm* tp = tuple_val(arg);
+            if (*tp == make_arityval(2) && tp[1] == am_precision && is_small(tp[2]))
+                precision = signed_val(tp[2]);
+            else
+                goto badarg;
+        } else {
+            goto badarg;
+        }
+        list = CDR(list_val(list));
+    }
+    if (is_not_nil(list)) {
+        goto badarg;
+    }
+
+    GET_DOUBLE(BIF_ARG_1, f);
+    if ((i = sys_double_to_chars_fixed(f.fd, fbuf, sizeof(fbuf), precision, compact)) <= 0)
+        BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR);
+    need = i*2;
+    hp = HAlloc(BIF_P, need);
+    BIF_RET(buf_to_intlist(&hp, fbuf, i, NIL));
+badarg:
+	BIF_ERROR(BIF_P, BADARG);
+}
+
 /**********************************************************************/
 
 /* convert a list of ascii  integer values e's +'s and -'s to a float */
diff --git a/erts/emulator/beam/bif.tab b/erts/emulator/beam/bif.tab
index 0674aae..7b9c2cc 100644
--- a/erts/emulator/beam/bif.tab
+++ b/erts/emulator/beam/bif.tab
@@ -91,6 +91,8 @@ ubif erlang:float/1
 ubif 'erl.lang.number':to_float/1	ebif_to_float_1 float_1
 bif erlang:float_to_list/1
 bif 'erl.lang.float':to_string/1	ebif_float_to_string_1 float_to_list_1
+bif erlang:float_to_list/2
+bif 'erl.lang.float':to_string/2	ebif_float_to_string_2 float_to_list_2
 bif erlang:fun_info/2
 bif 'erl.lang.function':info/2		ebif_fun_info_2
 bif erlang:garbage_collect/0
diff --git a/erts/emulator/beam/sys.h b/erts/emulator/beam/sys.h
index ca87d3d..5b02b9c 100644
--- a/erts/emulator/beam/sys.h
+++ b/erts/emulator/beam/sys.h
@@ -701,6 +701,7 @@ void fini_getenv_state(GETENV_STATE *);
 void init_sys_float(void);
 int sys_chars_to_double(char*, double*);
 int sys_double_to_chars(double, char*);
+int sys_double_to_chars_fixed(double, char*, int, int, int);
 void sys_get_pid(char *);
 
 /* erts_sys_putenv() returns, 0 on success and a value != 0 on failure. */
diff --git a/erts/emulator/sys/unix/sys_float.c b/erts/emulator/sys/unix/sys_float.c
index c59c99f..90b696f 100644
--- a/erts/emulator/sys/unix/sys_float.c
+++ b/erts/emulator/sys/unix/sys_float.c
@@ -743,6 +743,22 @@ sys_double_to_chars(double fp, char *buf)
     return s-buf; /* i.e strlen(buf) */
 }
 
+int
+sys_double_to_chars_fixed(double fp, char *buf, int sz, int precision, int compact)
+{
+    char *s = buf;
+
+    int n = snprintf(buf, sz, "%.*f", precision, fp);
+    /* Search upto decimal point */
+    if (*s == '+' || *s == '-') s++;
+    while (ISDIGIT(*s)) s++;
+    if (*s == ',') *s++ = '.'; /* Replace ',' with '.' */
+    if (compact)
+        for(s = buf + n - 1; *s == '0' && s > buf && *(s-1) != '.'; s--)
+            n--;
+    return n; /* i.e strlen(buf) */
+}
+
 /* Float conversion */
 
 int
diff --git a/erts/emulator/sys/vxworks/sys.c b/erts/emulator/sys/vxworks/sys.c
index 411b4b3..96d9e14 100644
--- a/erts/emulator/sys/vxworks/sys.c
+++ b/erts/emulator/sys/vxworks/sys.c
@@ -1603,6 +1603,16 @@ int sys_double_to_chars(double fp, char *buf)
   return strlen(buf);
 }
 
+int
+sys_double_to_chars_fixed(double fp, char *buf, int sz, int precision, int compact)
+{
+    int n = snprintf(buf, sz, "%.*f", precision, fp);
+    if (compact)
+        for(char *s = buf + n - 1; *s == '0' && s > buf && *(s-1) != '.'; s--)
+            n--;
+    return n; /* i.e strlen(buf) */
+}
+
 
 /* Floating point exceptions */
 
diff --git a/erts/emulator/sys/win32/sys_float.c b/erts/emulator/sys/win32/sys_float.c
index 9e67ca7..f5d27fd 100644
--- a/erts/emulator/sys/win32/sys_float.c
+++ b/erts/emulator/sys/win32/sys_float.c
@@ -118,7 +118,7 @@ int
 sys_double_to_chars(double fp, char *buf)
 {
     char *s = buf;
-    
+
     (void) sprintf(buf, "%.20e", fp);
     /* Search upto decimal point */
     if (*s == '+' || *s == '-') s++;
@@ -130,6 +130,22 @@ sys_double_to_chars(double fp, char *buf)
 }
 
 int
+sys_double_to_chars_fixed(double fp, char *buf, int sz, int precision, int compact)
+{
+    char *s = buf;
+
+    int n = snprintf(buf, sz, "%.*f", precision, fp);
+    /* Search upto decimal point */
+    if (*s == '+' || *s == '-') s++;
+    while (ISDIGIT(*s)) s++;
+    if (*s == ',') *s++ = '.'; /* Replace ',' with '.' */
+    if (compact)
+        for(s = buf + n - 1; *s == '0' && s > buf && *(s-1) != '.'; s--)
+            n--;
+    return n; /* i.e strlen(buf) */
+}
+
+int
 matherr(struct _exception *exc)
 {
     erl_fp_exception = 1;
diff --git a/erts/emulator/test/num_bif_SUITE.erl b/erts/emulator/test/num_bif_SUITE.erl
index d009994..e641514 100644
--- a/erts/emulator/test/num_bif_SUITE.erl
+++ b/erts/emulator/test/num_bif_SUITE.erl
@@ -25,6 +25,7 @@
 %% 	abs/1
 %%	float/1
 %%	float_to_list/1
+%%  float_to_list/2
 %%	integer_to_list/1
 %%	list_to_float/1
 %%	list_to_integer/1
@@ -93,7 +94,7 @@ t_float(Config) when is_list(Config) ->
     ok.
 
 
-%% Tests float_to_list/1.
+%% Tests float_to_list/1, float_to_list/2.
 
 t_float_to_list(Config) when is_list(Config) ->
     ?line test_ftl("0.0e+0", 0.0),
@@ -101,6 +102,14 @@ t_float_to_list(Config) when is_list(Config) ->
     ?line test_ftl("2.5e+0", 2.5),
     ?line test_ftl("2.5e-1", 0.25),
     ?line test_ftl("-3.5e+17", -350.0e15),
+    ?line "1.0000"  = float_to_list(1.0,   []),
+    ?line "1.0"     = float_to_list(1.0,   [compact]),
+    ?line "-1.0000" = float_to_list(-1.0,  []),
+    ?line "1.12"    = float_to_list(1.123, [{precision, 2}]),
+    ?line "1.123"   = float_to_list(1.123, [{precision, 3}]),
+    ?line "1.1230"  = float_to_list(1.123, [{precision, 4}]),
+    ?line "1.12300" = float_to_list(1.123, [{precision, 5}]),
+    ?line "1.123"   = float_to_list(1.123, [{precision, 5}, compact]),
     ok.
     
 test_ftl(Expect, Float) ->
diff --git a/lib/stdlib/src/erl_internal.erl b/lib/stdlib/src/erl_internal.erl
index bf6e5bc..63caa3a 100644
--- a/lib/stdlib/src/erl_internal.erl
+++ b/lib/stdlib/src/erl_internal.erl
@@ -255,6 +255,7 @@ bif(exit, 1) -> true;
 bif(exit, 2) -> true;
 bif(float, 1) -> true;
 bif(float_to_list, 1) -> true;
+bif(float_to_list, 2) -> true;
 bif(garbage_collect, 0) -> true;
 bif(garbage_collect, 1) -> true;
 bif(get, 0) -> true;
