月額表甲・乙欄の計算例

awk によるプログラム例ですが、 プログラムというより、 税法の解読例として理解してください。

素直に法律に従うのであれば、 コンピュータを使わないのが日本人としての義務ですが、 その義務に反してでも、使ってみようというのであれば、 ご自由に使っていただいてかまいません。 ただし、官僚国家==日本らしい、 「知らしむべからず、 よらしむべし」という根拠も示さない法律の解読ですから、 この計算が正しいという保証はありませんし、 数値は毎年変わりますので、注意が必要です。 (これは 2003 年版)

使いかたは、

  function tax(m, h, t) .. 源泉所得税額を求める
	m = 社会保険料控除後の金額 (円)
	h = 扶養者数 (控除対象配偶者、扶養者の合計)
	t = 0: 甲欄,  1: 乙欄(2 箇所以上から給与をもらう人)
です。


function tax(m, h, t,  x) {
  if (t == 0)	# 甲欄
	x = tax_k(m - k_koujo(m) - h_koujyo(h))
  else		# 乙欄
	x = tax_o(m, h)
  return x
}

# 給与所得控除の額
function k_koujo(m,  x) {	# 社会保険控除後の給与等の金額
  if (m <= 135416)
	x = 54167
  else if (m <= 149999)
	x = m * 0.40
  else if (m <= 299999)
	x = m * 0.30 + 15000
  else if (m <= 549999)
	x = m * 0.20 + 45000
  else if (m <= 833333)
	x = m * 0.10 + 100000
  else
	x = m * 0.05 + 141667
  return int(x + 0.999999)	# 給与所得控除の額
}

# 配偶者・扶養親族・基礎控除
function h_koujyo(h) {	# h = 扶養者数(控除対象配偶者を含む)
  return ++h * 31667
}

# 税額 (月額表甲欄)
function tax_k(m,  x) {
  return int(tax0(m) / 10 + 0.5) * 10
}

function tax0(m,  x) {
  if (m < 0)
	x = 0
  else if (m <= 275000)
	x = m * 0.08
  else if (m <= 658334)
	x = m * 0.16 - 22000
  else if (m <= 750000)
	x = m * 0.20 - 48334
  else if (m <= 1500000)
	x = m * 0.30 - 123334
  else
	x = m * 0.37 - 228334
  return x
}

# 税額 (月額表乙欄)
function tax_o(m, h,  d, e, u, v, x, y) {
  if (m < 87000)
	x = int(m * 0.05)	# 1 円未満切捨て
  else if (m <= 1130000) {
	if (m < 99000) {
		d = 1000	# 階差
		e = 87000	# 最小値
	}
	else if (m < 221000) {
		d = 2000
		e = 99000
	}
	else {
		d = 3000
		e = 221000
	}
	x = (m - e) - int(int((m - e) / d) * d)
	x = m - x
	y = x * 2.5
	u = tax0(y - k_koujo(y) - 31667)
	y = x * 1.5
	v = tax0(y - k_koujo(y) - 31667)
	x = int(int((u - v) / 100 + 0.5) * 100)	# 10 円の桁で四捨五入
  }
  else
	x = int((m - 1130000) * 0.35 + 392800)	# 1 円未満切捨て
  return x - h * 2530
}'


Unix を始めたばかりというかたから、 賞与の源泉徴収表はどうするのか というご質問がありましたが、 これは、昔も今も、謎解きする元気が出ませんでした。