首页 > 解决方案 > Scala中的简单税收计算

问题描述

假设我正在编写一个具有两个功能的玩具税计算器:

// calculate the tax amount for a particular income given tax brackets
def tax(income: BigDecimal, brackets: Seq[Bracket]): BigDecimal = ???

// calculate the min. income for a particular tax rate given tax brackets 
def income(taxRate: BigDecimal, brackets: Seq[Bracket]) = ???

我这样定义一个税级:

case class Bracket(maxIncomeOpt: Option[BigDecimal], rate: BigDecimal)

Bracket(Some(BigDecimal(10)), BigDecimal(10))10%收入最高 tp10 Bracket(Some(BigDecimal(20)), BigDecimal(20))的税级 指收入最高的税级20%tp20
Bracket(None, BigDecimal(30))30%任何收入的税级

现在我正在编写tax这样的函数:

def tax(income: BigDecimal, brackets: Seq[Bracket]): BigDecimal = {
  val (_, result) = brackets.foldLeft((BigDecimal(0), income)) { case ((result, rest), curr) =>
    val taxable = curr.maxIncomeOpt.fold(rest)(_.min(rest))
    (result + taxable * curr.rate / 100.0, rest - taxable)
  }
  result
} 

功能tax似乎有效,但认为Seq[Bracket]不是定义税级的最佳方式。税级是不相交的“背靠背”区间的排序序列,末尾有一个开区间。您如何定义税级?

标签: scalanumerictax

解决方案


我建议List[Tuple[Double, Double]]与原始形式大致相同。

元组在语义上的位置(lower_bound, tax_rate_in_range)。关键区别在于行为的基本单位是税收表,而不是单个括号。在此核心数据定义的计划内,如果数字括号变大,您可以添加优化,并且您可以为简单的解决方案保留重要的不变量,例如保持列表按lower_bound.


推荐阅读