5

考虑到 10% 的税适用于除食品以外的所有物品。此外,对进口商品征收 5% 的附加税。

如果一张音乐 CD 的成本是 12.49。该项目的税为 1.499。如果一瓶进口香水的成本是 47.50,则该物品的税为 7.125

有一项政策规定,一件物品的税款应四舍五入到最接近的 0.05。因此,1.499 应四舍五入为 1.5,7.125 应四舍五入为 7.25。

上述舍入要求可以使用以下逻辑来实现:

    (float) Math.ceil(taxAmount / 0.05f) * 0.05f;

将税收添加到物品的成本中可以得出:

音乐CD:12.49 + 1.5 = 13.99 进口巧克力盒:47.50 + 7.25 = 54.65。

我面临以下输入的问题:

如果进口一盒巧克力的成本是11.85,那么税金就是0.5925

使用四舍五入政策,四舍五入后的税金为 0.6。

当我们添加 11.85 + 0.6 这两个浮点数时,我们得到的结果是 12.450001。与其他输入不同,此特定输入提供了很多小数位,而不是其他输出中的 2 个小数位。

我尝试使用 BigDecimal 而不是 float 来存储所有值,并将比例设置为 2 位小数。这种方法的问题在于,如果未指定舍入策略,bigDecimal 将在某些情况下抛出异常。为 BigDecimal 提供舍入策略会导致使用提供给 BigDecimal 的舍入策略对项目成本和适用税费的总和进行舍入,从而改变所需的输出。

4

3 回答 3

8

你可以使用long而不是double使用双你可以做

double d = Math.round(d * 20) / 20.0; // round up to multiple of 0.05

使用多头(如美分)

long l = (l + 3) / 5 * 5;

尽管它通常被认为是使用的最佳实践intlong或者BigDecimal大多数投资银行和基金都在使用double,因为一旦您了解如何安全地使用它们,它们使用起来更简单(比 long)和更快(比 BigDecimal)。

于 2012-08-05T08:56:45.267 回答
2

将货币金额存储为整数(例如美分数)。

这是一个常见问题——谷歌会给你很多很好的解释。

这里有一个:为什么不使用 Double 或 Float 来表示货币?

于 2012-08-05T08:54:38.863 回答
0

这似乎是一个著名的技术面试问题的一部分关键是要了解您必须计算税款并将该金额四舍五入到 0.05 以计算四舍五入我使用了这个 groovy 脚本

import java.math.*

def myRound(BigDecimal d){ 
    def scale = new BigDecimal("0.05")
    def y = d.divide(scale)
    println "y :$y"
//    def q = y.round(new MathContext(0,RoundingMode.UP))
    def q = y.setScale(0,BigDecimal.ROUND_UP)
    println "q :$q (intero)"
    def z = q.multiply(scale)
    println "z :$z"
    return z
}

def taxBy(BigDecimal d,BigDecimal t){ 
    return myRound(d.multiply(t))
}
def importTax(BigDecimal d){ 
    return taxBy(d,new BigDecimal("0.15"))
}

def importBaseTax(BigDecimal b){ 
    return taxBy(d,new BigDecimal("0.05"))
}

ip = new BigDecimal("27.99")
ipt = importTax(ip)

println "${ip}-->${ipt} = ${ip+ipt}"

我希望这很有用!

于 2015-01-22T14:39:49.170 回答