summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Dickinson <mdickinson@enthought.com>2020-05-29 13:23:57 (GMT)
committerGitHub <noreply@github.com>2020-05-29 13:23:57 (GMT)
commit895c9c1d438367722f74f437fda96767d770662b (patch)
tree8b4a46c98dda92716458b5d2f24ea907b736e577
parent28316422124206f63ddd4b91f2e19c54b6e9cd9d (diff)
downloadcpython-895c9c1d438367722f74f437fda96767d770662b.zip
cpython-895c9c1d438367722f74f437fda96767d770662b.tar.gz
cpython-895c9c1d438367722f74f437fda96767d770662b.tar.bz2
bpo-40780: Fix failure of _Py_dg_dtoa to remove trailing zeros (GH-20435)
* Fix failure of _Py_dg_dtoa to remove trailing zeros * Add regression test and news entry * Add explanation about why it's safe to strip trailing zeros * Make code safer, clean up comments, add change note at top of file * Nitpick: avoid implicit int-to-float conversion in tests
-rw-r--r--Lib/test/test_format.py11
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2020-05-26-17-43-58.bpo-40780.3Ckdgm.rst2
-rw-r--r--Python/dtoa.c11
3 files changed, 24 insertions, 0 deletions
diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py
index 4559cd5..e9e5bb9 100644
--- a/Lib/test/test_format.py
+++ b/Lib/test/test_format.py
@@ -484,6 +484,17 @@ class FormatTest(unittest.TestCase):
with self.assertRaises(ValueError) as cm:
format(c, ".%sf" % (INT_MAX + 1))
+ def test_g_format_has_no_trailing_zeros(self):
+ # regression test for bugs.python.org/issue40780
+ self.assertEqual("%.3g" % 1505.0, "1.5e+03")
+ self.assertEqual("%#.3g" % 1505.0, "1.50e+03")
+
+ self.assertEqual(format(1505.0, ".3g"), "1.5e+03")
+ self.assertEqual(format(1505.0, "#.3g"), "1.50e+03")
+
+ self.assertEqual(format(12300050.0, ".6g"), "1.23e+07")
+ self.assertEqual(format(12300050.0, "#.6g"), "1.23000e+07")
+
if __name__ == "__main__":
unittest.main()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-26-17-43-58.bpo-40780.3Ckdgm.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-26-17-43-58.bpo-40780.3Ckdgm.rst
new file mode 100644
index 0000000..ed6020c
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-26-17-43-58.bpo-40780.3Ckdgm.rst
@@ -0,0 +1,2 @@
+Fix a corner case where g-style string formatting of a float failed to
+remove trailing zeros.
diff --git a/Python/dtoa.c b/Python/dtoa.c
index 822adc6..e629b29 100644
--- a/Python/dtoa.c
+++ b/Python/dtoa.c
@@ -64,6 +64,9 @@
* 7. _Py_dg_strtod has been modified so that it doesn't accept strings with
* leading whitespace.
*
+ * 8. A corner case where _Py_dg_dtoa didn't strip trailing zeros has been
+ * fixed. (bugs.python.org/issue40780)
+ *
***************************************************************/
/* Please send bug reports for the original dtoa.c code to David M. Gay (dmg
@@ -2563,6 +2566,14 @@ _Py_dg_dtoa(double dd, int mode, int ndigits,
}
++*s++;
}
+ else {
+ /* Strip trailing zeros. This branch was missing from the
+ original dtoa.c, leading to surplus trailing zeros in
+ some cases. See bugs.python.org/issue40780. */
+ while (s > s0 && s[-1] == '0') {
+ --s;
+ }
+ }
break;
}
}