Functional Weave
Code in TypeScript

math.percent-change@1.0.0

vectors.json

2,013 bytes · view raw

[
  { "name": "100 to 150 is up 50 percent", "args": [100, 150, "half-up"], "expect": 5000 },
  { "name": "150 to 100 is down 33.33 percent, not the 50 percent it went up", "args": [150, 100, "half-up"], "expect": -3333 },
  { "name": "halving is down 50 percent", "args": [200, 100, "half-up"], "expect": -5000 },
  { "name": "doubling is up 100 percent", "args": [2500, 5000, "half-up"], "expect": 10000 },
  { "name": "no change is zero", "args": [100, 100, "half-up"], "expect": 0 },
  { "name": "falling to zero is down 100 percent", "args": [999, 0, "half-up"], "expect": -10000 },
  { "name": "3 to 4 is 3333.33 basis points, rounded half-up", "args": [3, 4, "half-up"], "expect": 3333 },
  { "name": "3 to 4 rounded up", "args": [3, 4, "up"], "expect": 3334 },
  { "name": "3 to 2 rounded up is away from zero", "args": [3, 2, "up"], "expect": -3334 },
  { "name": "an exact half basis point rounds away from zero under half-up", "args": [20000, 20001, "half-up"], "expect": 1 },
  { "name": "an exact half basis point rounds to even under half-even", "args": [20000, 20001, "half-even"], "expect": 0 },
  { "name": "a loss that halves is an improvement, not a fall", "args": [-100, -50, "half-up"], "expect": 5000 },
  { "name": "a loss that grows is a fall", "args": [-100, -150, "half-up"], "expect": -5000 },
  { "name": "from a loss to a profit", "args": [-50, 50, "half-up"], "expect": 20000 },
  { "name": "from zero there is no percentage change", "args": [0, 500, "half-up"], "expect": null },
  { "name": "from zero to zero is still undefined", "args": [0, 0, "half-up"], "expect": null },
  { "name": "the largest difference that is still exact", "args": [1, 900719925475, "down"], "expect": 9007199254740000 },
  { "name": "a larger difference is an error, not a rounded answer", "args": [1, 900719925476, "half-up"], "expectError": "too large to express exactly" },
  { "name": "an unknown rounding mode is an error", "args": [100, 150, "nearest"], "expectError": "unknown rounding mode" }
]