15

我正在尝试计算百分比“因子”。也就是说,给定 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是因为我将计算货币百分比,所以我想控制四舍五入。

4

4 回答 4

17

我认为最好的解决方案是在划分时设置请求的比例:在这种情况下可能是 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_UP用于会计(在我的立法中)或ROUND_EVEN(用于统计)用于舍入模式。

于 2009-05-25T12:45:43.263 回答
9

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

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

这是对20to的简单更改的输出20.00,并带有您的拼写错误:-)

factor:0.20
final falue:100.00
Float Value:100.0
于 2009-05-25T08:10:09.543 回答
0

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

于 2009-05-25T15:08:55.033 回答
0

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

  1. 您已将 RoundingMode 设置为 FLOOR(这意味着 ROUND DOWN),并且
  2. 您的percentage变量的隐式比例为 0(任何BigDecimal从整数初始化但未指定比例的 s 的比例均为 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...)

于 2019-08-06T08:52:10.373 回答