Java,BigDecimal。分裂的问题

时间:2009-05-25 07:50:41

标签: 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);       
}

我希望结果如下:

factor: 0.2
final value: 100
float value: 100

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

factor:0
final falue:0
Float Value:100.0

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

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

5 个答案:

答案 0 :(得分: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);

最终价值100.00

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

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

答案 1 :(得分:9)

new BigDecimal("20")的比例为零,因为那里没有小数点。这意味着您的percentage.divide(hundred, BigDecimal.ROUND_FLOOR)将产生零(实际上是int(20/100)0)。

如果您确实想要进行小数处理,请使用new BigDecimal("20.00")以便正确设置比例,或使用其他构造函数之一来专门设置比例。

以下是从2020.00的简单更改的输出,以及你的拼写misteak: - )

factor:0.20
final falue:100.00
Float Value:100.0

答案 2 :(得分:0)

float只有6位精度,几乎绝不是一个好选择,我建议你使用double。 (或者在某些情况下BigDecimal会更好)

答案 3 :(得分:0)

在您的代码中factor是0而不是0.2的原因是

  1. 您已将RoundingMode设置为FLOOR(表示ROUND DOWN),并且
  2. 您的percentage变量的隐式小数位数为0(从轮数初始化的任何BigDecimal未指定小数位数的小数位数均为0)

因此,当您调用除法时,您将舍入所有小数位并保持小数位为0,因此将0.2舍入为0。

要获取正确的号码,您可以

  1. 明确指定比例,或
  2. 由于您知道要除以100,因此可以改用BigDecimal#divide(BigDecimal)方法(不提供scale或RoundingMethod)。在您的情况下,该方法将不会抛出ArithmeticException,因为不存在不终止小数的可能性(请考虑20/100 = 0.2、20 / 10000 = 0.002-小数总是被100除而终止)。

但是,如果要除以另一个数字,例如3,则需要指定小数位数,因为小数位数可能会不终止(请考虑10/3 = 3.3333333333 ...)

答案 4 :(得分:-2)

您可能想要使用ROUND_UP as rounding mode