如何使用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();
输出值为1234567890123451.2345678
。因此,我可以将整个部分限制为15,将小数部分限制为8.
答案 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");
}
}