Java, BigDecimal.除法问题

2022-09-03 13:00:19

我正在尝试计算百分比“因子”。也就是说,给定20%,将其转换为0.2(我的目的是稍后将值乘以该值并得到20%的值)。

无论如何,这个问题与这段代码有关:

public static void main(String[] args) {
    int roundingMode = BigDecimal.ROUND_FLOOR;
    BigDecimal hundred = new BigDecimal("100");
    BigDecimal percentageFactor = null;
    BigDecimal percentage = new BigDecimal("20");
    BigDecimal value = new BigDecimal("500");
    percentageFactor = percentage.divide(hundred, roundingMode);
    float f = percentage.floatValue() / hundred.floatValue();
    f = value.floatValue() * f;
    BigDecimal aux = value.multiply(percentageFactor);
    System.out.println("factor:"+percentageFactor.toString());
    System.out.println("final falue:"+aux.toString());
    System.out.println("Float Value:"+f);       
}

我希望这样做的结果是这样的:

factor: 0.2
final value: 100
float value: 100

而是返回零,因此我得到:percentage.divide(hundred, roundingMode);

factor:0
final falue:0
Float Value:100.0

我做错了什么?如何正确划分两个大小数?

顺便说一句,我正在使用,因为我将计算货币百分比,所以我想要控制四舍五入。BigDecimal


答案 1

我认为最好的解决方案是在除法时设置所要求的比例:在这种情况下,也许是2。

    var hundred = new BigDecimal(100);
    var percentage = new BigDecimal(20);
    var value = new BigDecimal(500);
    
    var percentageFactor = 
        percentage.divide(hundred,2, BigDecimal.ROUND_HALF_UP);
    
    value = value.multiply(percentageFactor);
    System.out.println("final value:"+ value);

最终值:100.00

乘法使用因子 (0+2) 的刻度,但也可以指定。

我会用于会计(在我的立法中)或(用于统计)四舍五入模式。ROUND_HALF_UPROUND_EVEN


答案 2

的刻度是零,因为你那里没有小数点。这意味着您的将产生零(它是有效的或)。new BigDecimal("20")percentage.divide(hundred, BigDecimal.ROUND_FLOOR)int(20/100)0

如果您真的想做分数,请使用正确设置比例,或者使用其他构造函数之一专门设置比例。new BigDecimal("20.00")

这是从简单的更改为的输出,并配有您的拼写错误:-)2020.00

factor:0.20
final falue:100.00
Float Value:100.0

推荐