客户余额比例作为其货币的指数

时间:2011-11-28 08:22:42

标签: java hibernate bigdecimal rounding

我在java hibernate项目下有2个类

带有变量(指数)和(BigDecimal)DataType

的货币类

&安培;

带有变量(余额)和(BigDecimal)DataType

的客户类

我想将余额比例设为指数

的示例:

1) if exponent = 2, and balance = 230.1340098 then balance must be 230.13
2) if exponent = 1, and balance = 230.1340098 then balance must be 230.1
3) if exponent = 3, and balance = 230.1340098 then balance must be 230.134
4) if exponent = 0, and balance = 230.1340098 then balance must be 230
....
....
....

我该怎么做?

我的意思是我想将客户余额等级作为其货币的指数

注意:我尝试BigDecimal.setScale()但这个方法需要常量整数字段dataType,其中exponent是BigDecimal和变量

4 个答案:

答案 0 :(得分:1)

您应该从exponent-BigDecimal中提取整数值,并将其作为参数用于setScale。请注意,您必须设置RoundingMode:

    BigDecimal bd = new BigDecimal("230.1340098");
    BigDecimal exponent;
    exponent = new BigDecimal("0");
    System.out.println(bd.setScale(exponent.intValue(), RoundingMode.HALF_UP));
    exponent = new BigDecimal("1");
    System.out.println(bd.setScale(exponent.intValue(), RoundingMode.HALF_UP));
    exponent = new BigDecimal("2");
    System.out.println(bd.setScale(exponent.intValue(), RoundingMode.HALF_UP));
    exponent = new BigDecimal("3");
    System.out.println(bd.setScale(exponent.intValue(), RoundingMode.HALF_UP));

答案 1 :(得分:1)

BigDecimal#setScale(...)应该有效:

BigDecimal balance = BigDecimal.valueOf(  230.1340098 );  
BigDecimal exponent = new BigDecimal( 2 ) ; //randomly chosen
BigDecimal rounded = balance.setScale( exponent.intValue(), RoundingMode.HALF_UP ) ); //you can use another rounding mode

这会产生rounded = 230.13

答案 2 :(得分:0)

您可以在intValue()上致电BigDecimal以获得所需的结果。

代码段:

private void testBigDecimal(BigDecimal exponent, double balance){
    BigDecimal finalOutput = new BigDecimal(balance);
    finalOutput = finalOutput.setScale(exponent.intValue(), BigDecimal.ROUND_CEILING);
    System.out.println(finalOutput.doubleValue());
}

答案 3 :(得分:0)

  

我尝试使用setScale(),但此方法需要常量整数

不,它不需要常数整数。它可以接受任何整数。您可以使用BigDecimal.intValue()将指数作为所需的数据类型。

但BigDecimal是指数值的一种非常奇怪的数据类型选择。你不能认真地期望它超出整数的范围。