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桁とは対照的に、多くの小数点以下の桁を提供します。

floatの代わりにBigDecimalを使用して、小数点以下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;

使用するのがベストプラクティスであると考えられることがよくありますが、安全に使用する方法を理解すると、使用が簡単(長く)かつ高速(BigDecimalより)になるためint、ほとんどの投資銀行やファンドが使用longします。BigDecimaldouble

于 2012-08-05T08:56:45.267 に答える
2

金額を整数(セント数など)として保存します。

これは一般的な問題です-グーグルはあなたにたくさんの素晴らしい説明をします。

ここに1つあります:通貨を表すためにDoubleまたはFloatを使用してみませんか?

于 2012-08-05T08:54:38.863 に答える
0

これは有名な技術面接の問題の一部のようです。要点は、税金を計算し、このグルーヴィーなスクリプトを使用した丸めを計算するには、その金額を上位0.05に丸める必要があることを理解することです。

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 に答える