遇到问题:后台返回的0.0008客户端显示的是科学计数法。
解决:把后台返回的数据先转成BigDecimal类型再保留指定小数(注意:返回的数必须大于0,不大于0时要先判断,不然保留的小数位数多的话还会科学计数法显示。当后台返回的是0,我这里保留了9位小数,还是科学计数法显示的。)
BigDecimal bigDecimal = new BigDecimal("0.0008");
//或
BigDecimal SettlementAmountFinal = BigDecimal.valueOf("0.0008");
//不知道后台返回有几位小数,所以这里保留9位
tv.setText(""+bigDecimal .setScale(9, BigDecimal.ROUND_HALF_UP));
如果后台返回的只有两位小数,这里显示一长串的0也不美观,所以这里去掉多余的0:
public static String subZeroAndDot(String s) {
if (s.indexOf(".") > 0) {
s = s.replaceAll("0+?$", "");//去掉多余的0
s = s.replaceAll("[.]$", "");//如最后一位是.则去掉
}
return s;
}
完整用法:
tv.setText(subZeroAndDot(String.valueOf(bigDecimal.setScale(9, BigDecimal.ROUND_HALF_UP))));
BigDecimal的加减乘除:
class ArithUtil{
private static final int DEF_DIV_SCALE=10;
private ArithUtil(){}
//精确的加法算法
public static double add(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.add(b2).doubleValue();
}
//精确的减法算法
public static double sub(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.subtract(b2).doubleValue();
}
//精确的乘法算法
public static double mul(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.multiply(b2).doubleValue();
}
//相对精确的除法运算,当发生除不尽的情况时,精确到小数点以后10位
public static double div(double d1,double d2){
return div(d1,d2,DEF_DIV_SCALE);
}
//相对精确的除法运算,当发生除不尽的情况时,精确到小数点以后指定精度(scale),再往后的数字四舍五入
public static double div(double d1,double d2,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}