Java,BigDecimal.分裂的问题

gon*_*nso 14 java division bigdecimal

我正在尝试计算百分比"因子".也就是说,给定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);       
}
Run Code Online (Sandbox Code Playgroud)

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

factor: 0.2
final value: 100
float value: 100
Run Code Online (Sandbox Code Playgroud)

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

factor:0
final falue:0
Float Value:100.0
Run Code Online (Sandbox Code Playgroud)

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

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

Kar*_*rlP 14

我认为最好的解决方案是在划分时设置所需的比例:在这种情况下可能是2.

    BigDecimal hundred = new BigDecimal(100);
    BigDecimal percentage = new BigDecimal(20);
    BigDecimal value = new BigDecimal(500);
    BigDecimal percentageFactor =
                 percentage.divide(hundred,2, BigDecimal.ROUND_HALF_UP);

    value = value.multiply(percentageFactor);
    System.out.println("final value:"+ value);
Run Code Online (Sandbox Code Playgroud)

最终价值100.00

(乘法是使用因子(0 + 2)的比例,但也可以指定.)

我将HALF_UP用于会计(在我的立法中)或EVEN(用于统计)用于舍入模式.


pax*_*blo 9

比例new BigDecimal("20")为零,因为你没有小数点.这意味着,你percentage.divide(hundred, BigDecimal.ROUND_FLOOR)会产生零(这是有效int(20/100)0).

如果你真的想做分数的东西,new BigDecimal("20.00")那么使用这样就可以正确设置比例,或者使用其他一个构造函数来专门设置比例.

这是从简单的改变20到的输出20.00,完成你的spellink misteak :-)

factor:0.20
final falue:100.00
Float Value:100.0
Run Code Online (Sandbox Code Playgroud)