From 6ed4581f545069488446682ee9b052798626327d Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Tue, 13 Jun 2017 13:36:56 +1000
Subject: [PATCH] py/formatfloat: Fix number of digits and exponent sign when
 rounding.

This patch fixes 2 things when printing a floating-point number that
requires rounding up of the mantissa:
- retain the correct precision; eg 0.99 becomes 1.0, not 1.00
- if the exponent goes from -1 to 0 then render it as +0, not -0
---
 py/formatfloat.c                         | 7 ++++++-
 tests/float/string_format_modulo.py      | 3 +++
 tests/float/string_format_modulo3.py     | 3 +--
 tests/float/string_format_modulo3.py.exp | 3 +--
 4 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/py/formatfloat.c b/py/formatfloat.c
index 9ff80d9f6..b16746b39 100644
--- a/py/formatfloat.c
+++ b/py/formatfloat.c
@@ -376,11 +376,16 @@ int mp_format_float(FPTYPE f, char *buf, size_t buf_size, char fmt, int prec, ch
                 rs[1] = '0';
                 if (e_sign == '-') {
                     e--;
+                    if (e == 0) {
+                        e_sign = '+';
+                    }
                 } else {
                     e++; 
                 }
+            } else {
+                // Need at extra digit at the end to make room for the leading '1'
+                s++;
             }
-            s++;
             char *ss = s; 
             while (ss > rs) {
                 *ss = ss[-1];
diff --git a/tests/float/string_format_modulo.py b/tests/float/string_format_modulo.py
index 03c8dd00a..aea534247 100644
--- a/tests/float/string_format_modulo.py
+++ b/tests/float/string_format_modulo.py
@@ -44,3 +44,6 @@ print(('%.40g' % 1e-3)[:2])
 print(('%.40g' % 1e-4)[:2])
 
 print("%.0g" % 1) # 0 precision 'g'
+
+print('%.1e' % 9.99) # round up with positive exponent
+print('%.1e' % 0.999) # round up with negative exponent
diff --git a/tests/float/string_format_modulo3.py b/tests/float/string_format_modulo3.py
index 563964786..5d26f2575 100644
--- a/tests/float/string_format_modulo3.py
+++ b/tests/float/string_format_modulo3.py
@@ -1,4 +1,3 @@
 # uPy and CPython outputs differ for the following
 print("%.1g" % -9.9) # round up 'g' with '-' sign
-print("%.1e" % 9.99) # round up with positive exponent
-print("%.1e" % 0.999) # round up with negative exponent
+print("%.2g" % 99.9) # round up
diff --git a/tests/float/string_format_modulo3.py.exp b/tests/float/string_format_modulo3.py.exp
index b158c7d7f..71432b340 100644
--- a/tests/float/string_format_modulo3.py.exp
+++ b/tests/float/string_format_modulo3.py.exp
@@ -1,3 +1,2 @@
 -10
-1.00e+01
-1.00e-00
+100
-- 
GitLab