diff --git a/py/formatfloat.c b/py/formatfloat.c
index 9ff80d9f63008df189d7c39dbca1c99d6211e0e9..b16746b39b1a96b8dbdf54dade23f7f61aaab682 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 03c8dd00aaaa52111252886f951acb7de9fd19f7..aea534247cc20f4a7e6f011f8f700925c191fde8 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 563964786502b4bc49f86905f6e4194afd9eea05..5d26f25751d49f85c325c905e35777b176a9b833 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 b158c7d7f38cecebb2b0fd1c42cb2c750bc978d9..71432b3404519753811382197d7b7a0de04a063d 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