在Kotlin中,我如何制作一个计算TAX或VAT的函数



在Kotlin中,我如何制作一个函数来计算我之前输入的价格的TAX或VAT?例如:我输入了一个数字(467(,我想从这个数字中得到与税款的总和。在希腊,我们有24%的税或增值税。

fun main(args: Array<String>) {
var input = readLine()
println(tax(0.24))
}
fun tax(x: Double): Double {
return 0.24 * x
}

最后,我希望在开始时输入价格,例如467*24%<--税款或增值税金额。我想弄清楚,但我做不到

我可能误解了这个问题,因为它看起来很基本…

问题中的代码将用户的一个数字读取到变量input中,但对它不做任何操作。所以我怀疑你想做的是println(tax(input))

然而,如果你尝试这样做,你会得到一个编译错误:

Type mismatch.
Required: Double
Found: String?

input是一个字符串(如果是文件结尾,则为null(,但tax()函数需要一个Double数字。所以你要做的就是把字符串转换成一个数字。最简单的方法是调用String的toDouble()方法。

如果你这样做,你会得到另一个编译器错误,因为你没有处理input可能为null的可能性(你不能在null上调用toDouble()(。所以你必须先检查一下,例如:

if (input != null)
println(tax(input.toDouble())

我认为这就是你想要的。

但是还有许多改进值得改进,例如:

  • 您可能不希望使用像Double这样的浮点二进制类型,因为它无法准确存储小数。(在显示时,它四舍五入到最接近的小数点,这通常会掩盖问题,但它会以许多微妙的方式反噬你。(相反,你可以使用没有这个问题的BigDecimal类型
  • 税率应该是恒定的,所以你不必在其他地方重复
  • 您可以向用户提供提示,然后使用字符串模板在输出中包含额外信息(如@Sid所建议的(。在这种情况下,最好存储价格,以避免不得不转换两次
  • 由于在创建input之后不会对其进行修改,因此将其设置为不可变的valvar更安全
  • 您可以使用tax()函数的较短表达式形式

有了所有这些变化,它可能看起来像这样:

val TAX_RATE = BigDecimal("0.24")
fun main(args: Array<String>) {
println("Enter the price:")
val input = readLine()

if (input != null) {
val price = input.toBigDecimal()
val taxPercentage = TAX_RATE.scaleByPowerOfTen(2)
println("€$price * tax @ $taxPercentage% = €${tax(price)}")
}
}
fun tax(x: BigDecimal) = TAX_RATE * x

我假设价格是欧元;在更复杂的程序中,货币可能会与价格一起传递/输入。在实践中,税收计算通常要复杂得多(例如,处理不同税率、零税率或免税的项目,根据买家的身份,可能无论如何都不需要缴税(…

(顺便说一句,"tax"不是缩写,所以通常不会大写。(

您可以这样做:

fun readLn() = readLine()!!
fun readNumAndCalcGreekTax() {
println("Enter a number")
val userInput = readLn().toInt()
val userInputPlusTax = userInput * 1.24
println("For $userInput plus %24 tax: Total:  $userInputPlusTax")
}
readNumAndCalcGreekTax()

输出将是

Enter a number
460
For 460 plus %24 tax: Total:  570.4

最新更新