gpt4 book ai didi

java - Java BigDecimal 与 The Financial Mans - "The 1 cent problem"

转载 作者:行者123 更新时间:2023-11-29 04:02:56 26 4
gpt4 key购买 nike

我有这个问题:财务人员说:“你的程序有误”

财务的官方值(value)表和最终计算是

base        %              total value667.63   -  1.5(0.015)   = 657.62705.98   -  1.5(0.015)   = 695.39687.77   -  1.5(0.015)   = 677.45844.62   -  1.5(0.015)   = 831.95743.23   -  1.5(0.015)   = 732.08775.15   -  1.5(0.015)   = 763.52874.82   -  1.5(0.015)   = 861.70949.63   -  1.5(0.015)   = 935.39987.18   -  1.5(0.015)   = 972.371040.28  -  1.5(0.015)   = 1024.681077.70  -  1.5(0.015)   = 1061.54995.68   -  1.5(0.015)   = 980.741280.55  -  1.5(0.015)   = 1261.351140.56  -  1.5(0.015)   = 1123.45653.23   -  1.5(0.015)   = 643.43847.49   -  1.5(0.015)   = 834.78995.68   -  1.5(0.015)   = 980.74

My function's return value must match the total value from that table:

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 表格缺失值!
BASE=1280.55 - descount=19.21 totalvalue=1261.34 表格缺失值!



在某些情况下,差异是 0.01 美分,但对于财务而言,这是不可能的,因为这个世界的人是 18.340 注册的,差异是 18340 x 0.01 x 365 x 2 = 4401,6 ===> R$ 4401,6 这个一美分的成本四舍五入不正确!谁能帮我?谢谢杰...这是 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);


}

}

我根据Jay的想法做了一些修改财务人员说:“好吧,我们永远不能给客户打折。我们需要一些时间来提高美分”。

谢谢大家!...

最佳答案

您确定您使用的是合适的 RoundingMode 吗? ? RoundingMode 1 为 ROUND_DOWN,RoundingMode 5 为 ROUND_HALF_DOWN。也许您应该使用 ROUND_HALF_EVEN(这在某些财务场景中很常见)?

此外,如果您使用这些枚举常量而不是 RoundingMode.valueOf 方法,代码会更清晰。

关于java - Java BigDecimal 与 The Financial Mans - "The 1 cent problem",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2232480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com