bpo-40780: Fix failure of _Py_dg_dtoa to remove trailing zeros (GH-20435) (GH-20514)
* 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
(cherry picked from commit 895c9c1d43
)
Co-authored-by: Mark Dickinson <mdickinson@enthought.com>
This commit is contained in:
parent
8fcc1474ef
commit
ad088ca5c6
|
@ -484,6 +484,17 @@ class FormatTest(unittest.TestCase):
|
||||||
with self.assertRaises(ValueError) as cm:
|
with self.assertRaises(ValueError) as cm:
|
||||||
format(c, ".%sf" % (INT_MAX + 1))
|
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__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix a corner case where g-style string formatting of a float failed to
|
||||||
|
remove trailing zeros.
|
|
@ -64,6 +64,9 @@
|
||||||
* 7. _Py_dg_strtod has been modified so that it doesn't accept strings with
|
* 7. _Py_dg_strtod has been modified so that it doesn't accept strings with
|
||||||
* leading whitespace.
|
* 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
|
/* 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++;
|
++*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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue