[Python-checkins] cpython: Close #20536: correctly handle Decimal exponents in statistics

nick.coghlan python-checkins at python.org
Sat Feb 8 14:55:27 CET 2014


http://hg.python.org/cpython/rev/0f9309f8c755
changeset:   89047:0f9309f8c755
user:        Nick Coghlan <ncoghlan at gmail.com>
date:        Sat Feb 08 23:55:14 2014 +1000
summary:
  Close #20536: correctly handle Decimal exponents in statistics

files:
  Lib/statistics.py           |   6 +++-
  Lib/test/test_statistics.py |  38 +++++++++++++++++++++++++
  Misc/NEWS                   |   3 +
  3 files changed, 46 insertions(+), 1 deletions(-)


diff --git a/Lib/statistics.py b/Lib/statistics.py
--- a/Lib/statistics.py
+++ b/Lib/statistics.py
@@ -243,9 +243,13 @@
     num = 0
     for digit in digits:
         num = num*10 + digit
+    if exp < 0:
+        den = 10**-exp
+    else:
+        num *= 10**exp
+        den = 1
     if sign:
         num = -num
-    den = 10**-exp
     return (num, den)
 
 
diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py
--- a/Lib/test/test_statistics.py
+++ b/Lib/test/test_statistics.py
@@ -686,6 +686,38 @@
         for d in (Decimal('NAN'), Decimal('sNAN'), Decimal('INF')):
             self.assertRaises(ValueError, statistics._decimal_to_ratio, d)
 
+    def test_sign(self):
+        # Test sign is calculated correctly.
+        numbers = [Decimal("9.8765e12"), Decimal("9.8765e-12")]
+        for d in numbers:
+            # First test positive decimals.
+            assert d > 0
+            num, den = statistics._decimal_to_ratio(d)
+            self.assertGreaterEqual(num, 0)
+            self.assertGreater(den, 0)
+            # Then test negative decimals.
+            num, den = statistics._decimal_to_ratio(-d)
+            self.assertLessEqual(num, 0)
+            self.assertGreater(den, 0)
+
+    def test_negative_exponent(self):
+        # Test result when the exponent is negative.
+        t = statistics._decimal_to_ratio(Decimal("0.1234"))
+        self.assertEqual(t, (1234, 10000))
+
+    def test_positive_exponent(self):
+        # Test results when the exponent is positive.
+        t = statistics._decimal_to_ratio(Decimal("1.234e7"))
+        self.assertEqual(t, (12340000, 1))
+
+    def test_regression_20536(self):
+        # Regression test for issue 20536.
+        # See http://bugs.python.org/issue20536
+        t = statistics._decimal_to_ratio(Decimal("1e2"))
+        self.assertEqual(t, (100, 1))
+        t = statistics._decimal_to_ratio(Decimal("1.47e5"))
+        self.assertEqual(t, (147000, 1))
+
 
 class CheckTypeTest(unittest.TestCase):
     # Test _check_type private function.
@@ -1074,6 +1106,12 @@
         actual = self.func(data*2)
         self.assertApproxEqual(actual, expected)
 
+    def test_regression_20561(self):
+        # Regression test for issue 20561.
+        # See http://bugs.python.org/issue20561
+        d = Decimal('1e4')
+        self.assertEqual(statistics.mean([d]), d)
+
 
 class TestMedian(NumericTestCase, AverageMixin):
     # Common tests for median and all median.* functions.
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -27,6 +27,9 @@
 Library
 -------
 
+- Issue #20536: the statistics module now correctly handle Decimal instances
+  with positive exponents
+
 - Issue #18805: the netmask/hostmask parsing in ipaddress now more reliably
   filters out illegal values and correctly allows any valid prefix length.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list