Bigdecimal限制整数和小数部分

时间:2013-09-05 12:09:19

标签: java

如何使用BigDecimal

将整个部分限制为15,将小数部分限制为8,如15.8

例如:

String quant= "1000";
String price = "123456789012345.12345678";
final int contant = 100;
BigDecimal bd1;
BigDecimal bd2;
String value = "";
bd1 = new BigDecimal(price).multiply(new BigDecimal(quant));
bd2 = bd1.divide(new BigDecimal(contant));
value = bd2.toPlainString();

输出值为1234567890123451.2345678。因此,我可以将整个部分限制为15,将小数部分限制为8.

4 个答案:

答案 0 :(得分:0)

您可以按照以下方式进行验证

String price = "123456789012345.12345678";
    String[] str=price.split("\\.");
    if(!((str[0].length()==15)&&(str[1].length()==8))){
        System.out.println("not a valid format");
    }

答案 1 :(得分:0)

如果你限制整个'部分到15,然后你将失去精确度,为什么你会这样做? 您可以使用BigDecimal.setScale限制(舍入)小数部分。 setScale可以取整数(应该使用多少小数部分)和舍入策略,例如BigDecimal.ROUND_UP

BigDecimal查看JavaDoc以获取更多信息。

答案 2 :(得分:0)

不确定为什么要这样做,但这是一种方式 -

int contant = 100;
String price = "123456789012345.12345678224423";
String quant = "1000";                
BigDecimal bd1 = new BigDecimal(price).multiply(new BigDecimal(quant));
BigDecimal bd2 = bd1.divide(new BigDecimal(contant));    

final int WHOLE_MAX = 15;
final int SCALE = 8;

String value = bd2.setScale(SCALE, RoundingMode.HALF_UP).toPlainString();

String tempWhole = value.substring(0, value.indexOf('.')); // Digits before the decimal point

String wholePart =   tempWhole.substring(0, Math.min(tempWhole.length(), WHOLE_MAX)); // Gets the first 15 digits
String decimalPart = value.substring(value.indexOf('.'));

value = wholePart.concat(decimalPart);
System.out.println(value);

输出:

  

123456789012345.23456782

答案 3 :(得分:0)

BigDecimal是精确描述的。您可以使用MathContext进行设置。

MathContext context = new MathContext(15 + 8, RoundingMode.HALF_UP);

当您申请时

BigDecimal value = new BigDecimal("1234567890123456789.12345678",context);

输出将是

1234567890123456789.1235

这是从数字中删除的内容最小的预期方式。如果你要设置数字的上限,你需要声明自己的类型,并检查结果是否更严格然后限制,那么你有一个溢出错误。

您可以通过扩展BigDecimal类

来实现控制它的类型
private class BigNumber extends BigDecimal {

        private final int exponent;
        private final int mantissa;
        private BigDecimal limit;

        public BigNumber(String val, int exponent, int mantissa) {
            super(val);
            this.exponent = exponent;
            this.mantissa = mantissa;

            char[] limit = new char[exponent];
            Arrays.fill(limit, '9');

            this.limit = new BigDecimal(limit).add(BigDecimal.ONE);
        }

        @Override
        public BigDecimal add(BigDecimal augend) {

            BigDecimal result = super.add(augend);

            if(result.compareTo(limit) < 0) {
                return result;
            }

            throw new RuntimeException("Nuber to large");
        }
    }