]> asedeno.scripts.mit.edu Git - bluechips.git/commitdiff
tweaks to splitting algorithm to result in more round divisions and fewer random pennies
authorScott Torborg <scott@crookedmedia.com>
Wed, 6 Jan 2010 04:34:33 +0000 (20:34 -0800)
committerScott Torborg <scott@crookedmedia.com>
Wed, 6 Jan 2010 04:34:33 +0000 (20:34 -0800)
bluechips/model/expenditure.py
bluechips/tests/model/test_expenditure.py

index 21172b9bcb046185e36e7c9ebf369651585623ac..4669ad1090c740aaac7284c1903bd01cbac0d037 100644 (file)
@@ -53,13 +53,11 @@ class Expenditure(object):
         for user, share in split_dict.items():
             if share == 0:
                 del split_dict[user]
-            else:
-                split_dict[user] = share / total
             
         amounts_dict = dict()
         
         for user, share in split_dict.iteritems():
-            amounts_dict[user] = Currency(split_dict[user] * self.amount)
+            amounts_dict[user] = Currency((share * self.amount) / total)
         
         difference = self.amount - sum(amounts_dict.itervalues())
         
index 47a3cdf43df7899fcc3ac541729e1d2a94a55efd..2bf8037cbc57dc1402998be412c55f30a26dcff4 100644 (file)
@@ -73,6 +73,22 @@ class TestExpenditure(TestCase):
                                  Currency('-0.01'),
                                  Currency('-0.00'))
 
+    def test_split_irrational_rounding(self):
+        e2 = model.Expenditure(self.u, Decimal('2375.00'),
+                               u'rounding test')
+        u2 = model.User(u'rat', u'Irrational Rat', False)
+        meta.Session.add(u2)
+        meta.Session.add(e2)
+        meta.Session.commit()
+        split_dict = {}
+        split_dict[u2] = Decimal('750.00')
+        split_dict[self.u] = Decimal('4000.00')
+        e2.split(split_dict)
+        assert e2.share(u2) == Decimal('375.00')
+        meta.Session.delete(e2)
+        meta.Session.delete(u2)
+        meta.Session.commit()
+
     def tearDown(self):
         meta.Session.delete(self.e)
         meta.Session.delete(self.u)