Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bigdecimal限制整数和小数部分_Java - Fatal编程技术网

Java Bigdecimal限制整数和小数部分

Java Bigdecimal限制整数和小数部分,java,Java,如何使用BigDecimal 例如: 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 BigDecim

如何使用
BigDecimal

例如:

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();

输出值为
12345678901233451.2345678
。所以我可以将整部分限制为15,小数部分限制为8

您可以进行如下验证

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

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


查看中的JavaDoc以了解更多信息。

不确定为什么要这样做,但这里有一种方法-

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);
输出:

1234567890123345.23456782


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

MathContext context=新的MathContext(15+8,取整模式。向上取整)

当你满足你的需要时

BigDecimal值=新的BigDecimal(“123456780123456789.12345678”,上下文)

这场比赛将被淘汰

12345678901213456789.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");
        }
    }
私有类BigNumber扩展了BigDecimal{
私有最终整数指数;
私人最终整数尾数;
私有大十进制限制;
公共BigNumber(字符串val、整数指数、整数尾数){
超级(val);
这个指数=指数;
this.尾数=尾数;
字符[]限制=新字符[指数];
数组。填充(限制为“9”);
this.limit=新的BigDecimal(limit).add(BigDecimal.ONE);
}
@凌驾
公共BigDecimal添加(BigDecimal结束){
BigDecimal结果=super.add(augend);
如果(结果比较(限值)<0){
返回结果;
}
抛出新的RuntimeException(“number to large”);
}
}

我假设15和8是指数字量。因此,您希望上述代码的结果为“234567890123451.2345678”(即删除第一个“1”,总共15+7位)?对不起,我无法接受多个答案。您都是正确的。