Tax Brackets
January 26, 2021
We represent the tax brackets as a list of pairs, arranged from high to low:
(define brackets '((100000 0.4) (30000 0.25) (10000 0.1)))
Then the tax calculation is a simple recursion:
(define (tax income brackets)
(if (null? brackets) 0
(+ (* (max (- income (caar brackets)) 0) (cadar brackets))
(tax (min income (caar brackets)) (cdr brackets)))))
Then the tax calculation is a simple recursion:
> (tax 123456 brackets) 28882.4
You can run the program at https://ideone.com/T62CTT.
Perl
sub tax { return ( ( $_[0] >= 10_000 ? 2*($_[0]-10_000) : 0 ) + ( $_[0] >= 30_000 ? 3*($_[0]-30_000) : 0 ) + ( $_[0] >= 100_000 ? 3*($_[0]-100_000) : 0 ) ) / 20; }Forgot to say – the trick here is to only add the additional tax per bracket – so about 10K is 10%, above 30K is then (25-10)% = 15% and about 100K is then (40-25)% = 15% as well…
A solution in Racket:
(define (taxbrk in (brk '(100000 30000 10000 0)) (tax '(0.40 0.25 0.10 0)) (out 0)) (cond ((zero? in) (display (real->decimal-string out))) ((> in (car brk)) (taxbrk (car brk) (cdr brk) (cdr tax) (+ out (* (car tax) (- in (car brk)))))) (else (taxbrk in (cdr brk) (cdr tax) out))))Solution in use:
Here’s a solution in Python.
from decimal import Decimal def tax(income): output = Decimal(0) for threshold, rate in (100_000, '.40'), (30_000, '.25'), (10_000, '.10'): if income >= threshold: output += Decimal(rate) * (income - threshold) income = threshold return output print(tax(123_456))Output:
Solution in Java:
public class TaxBrackets { public static void main(String[] args) { double income = 123456; double calculateTax = calculateTax(income); System.out.println(calculateTax); } private static double calculateTax(double income) { double totalTax = 0; double import1 = 10000; double import2 = 30000; double import3 = 100000; if (income <= import1) { return totalTax; } if (income > import1 && income <= import2) { income = income - import1; totalTax = (income * 10) / 100; return totalTax; } if (income > import2 && income <= import3) { income = income - import2; totalTax = ((income * 25) / 100) + 2000; return totalTax; } if (income > import3) { income = income - import3; totalTax = ((income * 40) / 100) + 2000 + 17500; return totalTax; } return totalTax; }