1

私はこの問題を抱えています:財務担当者は「あなたのプログラムの誤り」と言っています

財務からの値と最終計算の公式表は

ベース%合計値
667.63-1.5(0.015)= 657.62
705.98-1.5(0.015)= 695.39
687.77-1.5(0.015)= 677.45
844.62-1.5(0.015)= 831.95
743.23-1.5(0.015)= 732.08
775.15-1.5(0.015)= 763.52
874.82-1.5(0.015)= 861.70
949.63-1.5(0.015)= 935.39
987.18-1.5(0.015)= 972.37
1040.28-1.5(0.015)= 1024.68
1077.70-1.5(0.015)= 1061.54
995.68-1.5(0.015)= 980.74
1280.55-1.5(0.015)= 1261.35
1140.56-1.5(0.015)= 1123.45
653.23-1.5(0.015)= 643.43
847.49-1.5(0.015)= 834.78
995.68-1.5(0.015)= 980.74

関数の戻り値は、そのテーブルの合計値と一致する必要があります。

public static void main(String[] args) {
    BigDecimal[] valorbase= {
        new BigDecimal("667.63"),
        new BigDecimal("705.98"),
        new BigDecimal("687.77"),
        new BigDecimal("844.62"),
        new BigDecimal("743.23"),
        new BigDecimal("775.15"),
        new BigDecimal("874.82"),
        new BigDecimal("949.63"),
        new BigDecimal("987.18"),
        new BigDecimal("1040.28"),
        new BigDecimal("1077.70"),
        new BigDecimal("995.68"),
        new BigDecimal("1280.55"),
        new BigDecimal("1140.56"),
        new BigDecimal("653.23"),
        new BigDecimal("847.49"),
        new BigDecimal("995.68")    
    };

    for (int i = 0; i < valorbase.length; i++) {
        BigDecimal desconto=new BigDecimal("0.015");
        BigDecimal valor_a_descontar=valorbase[i].multiply(desconto);

            valor_a_descontar=valor_a_descontar.setScale(2,RoundingMode.HALF_UP);
    //desconto=desconto.setScale(2,RoundingMode.HALF_UP);


    BigDecimal valortotal=valorbase[i].subtract(valor_a_descontar);
    valortotal.setScale(3,RoundingMode.HALF_UP);
    valortotal.setScale(2,RoundingMode.HALF_UP);

        System.out.println("BASE=" + valorbase[i] + " - descount=" + valor_a_descontar + " totalvalue=" + valortotal);
    }
}

システムアウト: BASE=1077.70 - descount=16.17 totalvalue=1061.53 missing value of table! BASE=1280.55 - descount=19.21 totalvalue=1261.34 missing value of table!

場合によっては差分は0.01セントですが、この人々の世界は18.340レジストリであるため、財務的には不可能です。差分は18340 x 0.01 x 365 x 2 = 4401,6 ===> R$4401,6これは1セントが正しく丸められていません!誰か助けてもらえますか?ありがとうJAY...これはJAYによって提案されました:

public static void main(String[] args){
    BigDecimal[] valorbase= {
            new BigDecimal("667.63"),
            new BigDecimal("705.98"),
            new BigDecimal("687.77"),
            new BigDecimal("844.62"),
            new BigDecimal("743.23"),
            new BigDecimal("775.15"),
            new BigDecimal("874.82"),
            new BigDecimal("949.63"),
            new BigDecimal("987.18"),
            new BigDecimal("1040.28"),
            new BigDecimal("1077.70"),
            new BigDecimal("995.68"),
            new BigDecimal("1280.55"),
            new BigDecimal("1140.56"),
            new BigDecimal("653.23"),
            new BigDecimal("847.49"),
            new BigDecimal("995.68")                

            };




    for(int i=0;i<valorbase.length;i++){

    BigDecimal desconto=new BigDecimal("0.985");

    //BigDecimal valor_a_descontar=valorbase[i].multiply(desconto);




    //valor_a_descontar=valor_a_descontar.setScale(2,RoundingMode.HALF_UP);
    //desconto=desconto.setScale(2,RoundingMode.HALF_UP);


    //BigDecimal valortotal=valorbase[i].subtract(valor_a_descontar);
    BigDecimal valortotal=valorbase[i].multiply(desconto);

    //valortotal.setScale(3,RoundingMode.HALF_UP);
    //valortotal.setScale(2,RoundingMode.HALF_EVEN);

    System.out.println("subtotal="+valortotal);

    if(valorbase[i].doubleValue()/1000>=1){
        valortotal=valortotal.setScale(8,RoundingMode.HALF_UP);
        valortotal=valortotal.setScale(7,RoundingMode.HALF_UP);
        valortotal=valortotal.setScale(6,RoundingMode.HALF_UP);
        valortotal=valortotal.setScale(5,RoundingMode.HALF_UP);
        valortotal=valortotal.setScale(4,RoundingMode.HALF_UP);
        valortotal=valortotal.setScale(3,RoundingMode.HALF_UP);
        valortotal=valortotal.setScale(2,RoundingMode.HALF_UP);
    }else{
        valortotal=valortotal.setScale(2,RoundingMode.HALF_UP);
    }       
    System.out.println("BASE="+valorbase[i]+" totalvalue="+valortotal);


    }

}

ジェイのアイデアに基づいて、私は金融関係者が言ういくつかの変更を加えます:「まあ、私たちはクライアントに割引を適用することはできません。

全てに感謝!...

4

2 に答える 2

3

適切なRoundingModeを使用していることを確認しますか?RoundingMode 1はROUND_DOWNであり、RoundingMode5はROUND_HALF_DOWNです。おそらくあなたは使用することになっていますROUND_HALF_EVENか(これはいくつかの財務シナリオで一般的です)?

また、RoundingMode.valueOfメソッドの代わりにこれらの列挙型定数を使用すると、コードがより明確になります。

于 2010-02-09T21:25:08.680 に答える
1

このような問題がある場合、正確な丸め規則について常に質問があります。

同様に、減算の前または後に丸めますか。また、ショートカットとして、1.5%の割引は、通常価格の98.5%を請求することと同じであるため、元の価格に98.5%を掛けることができ、余分な減算を行う必要はありません。 。右?

価格が667.00であるとします。

方法1:667.00 * .015 = 10.005、10.01に切り上げます。次に、667.00-10.01=656.99。

方法2:667.00 * .015=10.005。667.00-10.005=656.995。657.00に切り上げます。別の答え。

方法3:667.00 * .985 = 656.995、657.00に切り上げます。

また、Roneyは、1077.70のテーブルが間違っていると述べました。1280.55でも間違っています。

于 2010-02-09T22:30:29.280 に答える