double和float精度问题

遇到问题:后台返回的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();  
    }  
}  

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

举儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值