0

您如何使用 15.8 将整个部分限制为 15 并将小数部分限制为 8BigDecimal

例如:

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

4 回答 4

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");
    }
于 2013-09-05T12:21:23.863 回答
0

如果您将“整体”部分限制为 15,那么您将失去精度,您为什么要这样做?您可以使用 限制(四舍五入)小数部分BigDecimal.setScalesetScale可以采用整数(应使用多少个小数部分)和舍入策略,例如BigDecimal.ROUND_UP.

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

于 2013-09-05T12:22:52.197 回答
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

于 2013-09-05T12:36:00.317 回答
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");
        }
    }
于 2013-09-05T13:05:36.303 回答