質問

こんな問題があります: 金融関係者はこう語る。「プログラムのエラーです」.

公式の価値表と財務からの最終計算は次のとおりです。

base        %              total value
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 によって提案されました。

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);


    }

}

ジェイのアイデアに基づいて、私は金融の人が言ういくつかの修正を加えます:「そうですね、クライアントに割引をすることは決してできません。支払い期限を切り上げてセントを増やす必要があります。」

全てに感謝!...

役に立ちましたか?

解決

適切なツールを使用していますか? 丸めモード?丸めモード 1 は ROUND_DOWN RoundingMode 5 は ROUND_HALF_DOWN. 。おそらくあなたは使うことになっている ROUND_HALF_EVEN (これは一部の財務シナリオでは一般的です)?

また、これらの enum 定数を代わりに使用すると、コードがより明確になります。 RoundingMode.valueOf 方法。

他のヒント

このような問題では、正確な丸め規則についての疑問が常に発生します。

たとえば、四捨五入するのは減算の前ですか、後ですか。また、近道として、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も間違っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top