]> git.ipfire.org Git - thirdparty/babel.git/commitdiff
Only use bankers round algorithm as a tie breaker if there are two nearest numbers...
authorFelix Schwarz <felix.schwarz@oss.schwarz.eu>
Tue, 30 Aug 2011 20:53:33 +0000 (20:53 +0000)
committerFelix Schwarz <felix.schwarz@oss.schwarz.eu>
Tue, 30 Aug 2011 20:53:33 +0000 (20:53 +0000)
ChangeLog
babel/numbers.py
babel/tests/numbers.py

index a432aaba252506a8141888efde3703873473d8a5..2ed745f54e8db557d2fdc6bec4ba467fb84cdf85 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -31,6 +31,9 @@ http://svn.edgewall.org/repos/babel/tags/1.0.0/
    handlers (#227, reported with initial patch by dfraser)
  * Fix exception if environment contains an invalid locale setting (#200)
  * use cPickle instead of pickle for better performance (#225)
+ * Only use bankers round algorithm as a tie breaker if there are two nearest
+   numbers, round as usual if there is only one nearest number (#267, patch by 
+   Martin)
 
 
 Version 0.9.6
index 622816761b9c3643ee0f26756fbdd6b952229513..5ea6c381008e9d07a1dca35a297cec5438f8a911 100644 (file)
@@ -361,6 +361,13 @@ def bankersround(value, ndigits=0):
         add = 1
     elif digits[i] == '5' and digits[i-1] in '13579':
         add = 1
+    elif digits[i] == '5':     # previous digit is even
+        # We round up unless all following digits are zero.
+        for j in xrange(i + 1, len(digits)):
+            if digits[j] != '0':
+                add = 1
+                break
+
     scale = 10**ndigits
     if isinstance(value, Decimal):
         return Decimal(int(value * scale + add)) / scale * sign
index bd7958ac47ea33ca32c99fafa66b9932d6d3eb68..f4d1d4e34b69ec39c90d390240b498a5d26df5cd 100644 (file)
@@ -12,7 +12,6 @@
 # history and logs, available at http://babel.edgewall.org/log/.
 
 from decimal import Decimal
-
 import doctest
 import unittest
 
@@ -137,10 +136,24 @@ class FormatDecimalTestCase(unittest.TestCase):
         self.assertEqual(fmt, '0E0')
 
 
+class BankersRoundTestCase(unittest.TestCase):
+    def test_round_to_nearest_integer(self):
+        self.assertEqual(1, numbers.bankersround(Decimal('0.5001')))
+    
+    def test_round_to_even_for_two_nearest_integers(self):
+        self.assertEqual(0, numbers.bankersround(Decimal('0.5')))
+        self.assertEqual(2, numbers.bankersround(Decimal('1.5')))
+        self.assertEqual(-2, numbers.bankersround(Decimal('-2.5')))
+
+        self.assertEqual(0, numbers.bankersround(Decimal('0.05'), ndigits=1))
+        self.assertEqual(Decimal('0.2'), numbers.bankersround(Decimal('0.15'), ndigits=1))
+
+
 def suite():
     suite = unittest.TestSuite()
     suite.addTest(doctest.DocTestSuite(numbers))
     suite.addTest(unittest.makeSuite(FormatDecimalTestCase))
+    suite.addTest(unittest.makeSuite(BankersRoundTestCase))
     return suite
 
 if __name__ == '__main__':