Tax Brackets
January 26, 2021
My W-2 form came in the mail a few days ago, so a task about taxes is appropriate. Given the following tax brackets:
income cap tax rate$ 10,000 0%$ 30,000 10%$100,000 25%more 40%
Calculate the amount of tax given an amount of income. The tax brackets work like this: If your income is less than $10,000, your tax is $0. If your income is between $10,000 and $30,000, your tax is 10% of your income in excess of $10,000. If your income is between $30,000 and $100,000, your tax is 10% of the $20,000 of income between $10,000 and $30,000 (or $2,000) plus 25% of your income over $30,000. If your income is over $100,000, your tax is 10% of the $20,000 of income between $10,000 and $30,000 (or $2,000), plus 25% of your income between $30,000 and $100,000 (or $17,500), plus 40% of your income over $100,000 (ouch!).
For example, if your income is $123,456, your tax is $2,000 plus $17,500 plus 40% of $23,456 (or $9,382.40), a total tax of $28,882.40, or 23.4% of your income.
Your task is to write a program that calculates the amount of tax due for a given amount of income. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
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; }