]> git.scottworley.com Git - inverse-tax/commitdiff
Calculate inverse bounds correctly
authorScott Worley <scottworley@scottworley.com>
Thu, 23 May 2019 21:38:38 +0000 (14:38 -0700)
committerScott Worley <scottworley@scottworley.com>
Thu, 23 May 2019 21:38:38 +0000 (14:38 -0700)
tax.js
tax.test.js

diff --git a/tax.js b/tax.js
index d9bd34c15b03849b0440ce574469afc2db8f44f6..cd0027a1475930802935b28e34cba14597ea5fa5 100644 (file)
--- a/tax.js
+++ b/tax.js
@@ -61,7 +61,7 @@ function invert(table) {
   // and the calculate the inverse's bounds
 
   const ms = table.map(([start, end, rate]) => 1 - rate);
-  const full_brackets = [[0]].concat(table.map(([start, end, rate]) => (end - start) * rate)).slice(0, table.length);
+  const full_brackets = [0].concat(table.map(([start, end, rate]) => (end - start) * rate)).slice(0, table.length);
   function sum_lower_brackets(remaining_brackets, acc = 0) {
     if (remaining_brackets.length == 0) return [];
     return [acc + remaining_brackets[0]].concat(sum_lower_brackets(remaining_brackets.slice(1), acc + remaining_brackets[0]));
@@ -80,7 +80,7 @@ function invert(table) {
   const inverse_table = table.map(([start, end, rate], i) => {
     const m = ms[i];
     const b = bs[i];
-    return [(start - b) / m, (end - b) / m, m, b];
+    return [m * start + b, m * end + b, m, b];
   });
   return function(net) {
     for (const [start, end, m, b] of inverse_table) {
index 125cc2091cccd1587c27d9687e10271864f20066..27767fedc6912d48eb7be731be102919c02bd874 100644 (file)
@@ -59,4 +59,5 @@ test("invert", () => {
   assert.strictEqual(invert([[10, Infinity, .1]])(19), 20);
   assert.strictEqual(invert([[10, Infinity, .1]])( 9),  9);
   assert.strictEqual(invert([[0, 100, .1], [100, Infinity, .2]])(170), 200);
+  assert.strictEqual(invert([[0, 100, .1], [100, Infinity, .2]])(112), 127.5);
 });