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位)?对不起,我无法接受多个答案。您都是正确的。