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

作者: zsgnaw | 来源:发表于2018-07-11 16:42 被阅读33次
    • 数值变成指数形式
      有时候直接使用服务端返回的数值,如余额等大额数值,哪怕是用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;
    

    相关文章

      网友评论

        本文标题:开发中碰到的一些数字问题处理

        本文链接:https://www.haomeiwen.com/subject/shbhpftx.html