Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的简单税务计算_Scala_Numeric_Tax - Fatal编程技术网

Scala中的简单税务计算

Scala中的简单税务计算,scala,numeric,tax,Scala,Numeric,Tax,假设我正在编写一个带有两个函数的玩具税计算器: // 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 incom

假设我正在编写一个带有两个函数的玩具税计算器:

// 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)
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
} 
等级(一些(大十进制(10)),大十进制(10))
表示tp以上收入的
10%
税收等级
等级(一些(大十进制(20)),大十进制(20))
指20%以上的收入
20
的税收等级
20

等级(无,BigDecimal(30))
指任何收入的
30%
税收等级

现在我在写函数
tax
如下:

case class Bracket(maxIncomeOpt: Option[BigDecimal], rate: BigDecimal)
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[括号]
不是定义税括号的最佳方法。税括号是不相交的“背对背”区间的排序序列,末尾为开放区间。您如何定义税括号?

我建议大致相同,将
列表[Tuple[Double,Double]]
作为原始形式


其中元组在语义上是
(下限,税率在\u范围内)
。关键区别在于,行为的原子单位是税收表,而不是单个括号。在由该核心数据定义的计划内,如果数字括号变大,您可以添加优化,并且您可以为原始解决方案保留重要的不变量,如保持列表按
下限排序

我将税括号定义为分段常量函数:

def taxBracket(i: Int): Float = {
  case _ if i < 10 => 0.1
  case _ if i < 20 => 0.2
  case _ => 0.3
}
def-taxBracket(i:Int):Float={
如果i<10=>0.1
如果i<20=>0.2
案例=0.3
}

它易于阅读,易于为任何类型的价值定制行为(比如说,它在某个地方或任何地方变为线性,事实上,你可以根据自己的需要将各个部分连接起来),计算金额N的税额只是该函数在0和N之间的数值积分。

考虑使用代数数据类型定义括号和
正整数来模拟开放区间的解决方案

abstract class TaxBracket(val from: Double, val to: Double, val rate: Double) {
  def tax(income: Double) = {
    if (income >= from)
      if (to.isPosInfinity) (income - from) * rate
      else if (income - to > 0) (to - from) * rate
      else (income - (from - 1)) * rate
    else
      0.0
  }
}
case object A extends TaxBracket(0, 12500, 0.0)
case object B extends TaxBracket(12501, 50000, 0.2)
case object C extends TaxBracket(50001, 150000, 0.4)
case object D extends TaxBracket(150001, Double.PositiveInfinity, 0.45)
现在税务计算简化为

def tax(income: Double, bands: List[TaxBracket]): Double =
  bands.map(_.tax(income)).sum
例如,使用上面定义的

tax(60000, List(A, B, C, D)) // res0: Double = 11499.8
这是可以验证的

要获得给定有效税率的最低收入,请尝试

def income(etr: Double, bands: List[TaxBracket]): Option[Double] = {
  bands.map(b => (b.from, b.to)).find { case (from, to) =>
    if (to.isPosInfinity) true
    else (tax(to, bands) / to) >= etr
  }.map { case (lowerBound, upperBound) => lowerBound }
}

income(0.4, List(A, B, C, D)) // res1: Option[Double] = Some(150001.0)

谢谢也许你是对的,这样一个函数是建立税收等级模型的更好方法。在这种情况下,您将如何编写
tax
income
函数?很好!非常感谢。这个解决方案看起来非常简单。您将如何实现
收入
功能来计算给定有效税率下的最低收入?