开发中碰到的一些数字问题处理

  • 数值变成指数形式
    有时候直接使用服务端返回的数值,如余额等大额数值,哪怕是用String来接收,也会自动变成指数形式显示,还是需要使用DecimalFormat来对数字格式化一下。
public static String format_2(double d) {
     DecimalFormat df = new DecimalFormat("0.00");
     df.setRoundingMode(RoundingMode.HALF_UP);
     return df.format(d);
}
  • float和double计算精度丢失问题
    使用BigDecimal
public class ArithUtil {

    private static final int DEF_DIV_SCALE=10;

    private ArithUtil(){}

    public static double add(double d1,double d2){
        return add(Double.toString(d1), Double.toString(d2));
    }

    public static double add(String d1, String d2){
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.add(b2).doubleValue();
    }

    public static double sub(double d1,double d2){
        return sub(Double.toString(d1), Double.toString(d2));
    }

    public static double sub(String d1, String d2){
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.subtract(b2).doubleValue();
    }

    public static double mul(double d1,double d2){
        return mul(Double.toString(d1), Double.toString(d2));
    }

    public static double mul(String d1, String d2){
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.multiply(b2).doubleValue();
    }

    public static double div(double d1,double d2){
        return div(d1,d2,DEF_DIV_SCALE);
    }

    public static double div(double d1,double d2,int scale){
        return div(Double.toString(d1), Double.toString(d2), scale);
    }

    public static double div(String d1, String d2, int scale){
        if(scale < 0){
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1=new BigDecimal(d1);
        BigDecimal b2=new BigDecimal(d2);
        return b1.divide(b2,scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
  • int + int 溢出问题
    int low,high,mid;
    int mid = (low + high) / 2 应该写成 int mid = low + (high – low) / 2,因为low + high可能会溢出;

  • 虚拟币兑换问题
    // 服务端返回了一个coinExchangeRate = 0.01来表示虚拟币比例,比例为100:1(元)
    // 一开始也没做什么处理,本身这个比例就是1个代表1分,也没啥问题
    // 突然有天老板觉得比例太高了,要求在其他条件不变得情况下把比例改成1000:1
    // 这样个位数上的虚拟币对应的其实就是厘,厘是不做处理的所以会显示成:
    // 1005个虚拟币抵扣1.00元或者1005个虚拟币抵扣1.01元,其实是对不上的
    // 只能再做下处理,一般来说rmb单位最小兼容到

// 计算多少个虚拟币表示1分,如果小于1,则表示最小单个虚拟币即大于1分,不需要处理
int danwei = (int) (1 / (100 * coinExchangeRate));
// 实际使用的虚拟币个数,去掉不到分的部分
if (danwei > 0)
    mIntCoinCnt = mIntCoinCnt / danwei * danwei; 
// 实际虚拟币代扣金额
mCoinAmount = mIntCoinCnt * coinExchangeRate;
    原文作者:zsgnaw
    原文地址: https://www.jianshu.com/p/f78257372089
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞