zoukankan      html  css  js  c++  java
  • 报单总费用比各项目相加费用少一元钱

    问题:报单时候显示的总费用和各项目费用相加和不一致。

    排查:查看log发现,报单前的数据income总收入显示49.999999992345,各项目分别有:里程费39,等候费一元,动态加价10元(封顶金额)。

    怀疑在处理过程中有double相加减问题导致。

    经调试,发现动态加倍时候,两个浮点数相加(里程费和远途费相加),导致和的值有偏差,从而导致总费用出现0.99999992394。

    处理:

    Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降。

    要保证精度就要使用BigDecimal类,而且不能直接从double直接转BigDecimal,要将double转string再转BigDecimal。也就是不能使用BigDecimal(double val) 方法,你会发现没有效果。要使用BigDecimal(String val) 方法。

    1、相加

    public static double add(double a1, double b1) { 
       BigDecimal a2 = new BigDecimal(Double.toString(a1)); 
       BigDecimal b2 = new BigDecimal(Double.toString(b1)); 
       return a2.add(b2).doubleValue(); 
      }

    2、相减

    public static double sub(double a1, double b1) { 
       BigDecimal a2 = new BigDecimal(Double.toString(a1)); 
       BigDecimal b2 = new BigDecimal(Double.toString(b1)); 
       return a2.subtract(b2).doubleValue(); 
      }

    3、相乘

    public static double mul(double a1, double b1) { 
       BigDecimal a2 = new BigDecimal(Double.toString(a1)); 
       BigDecimal b2 = new BigDecimal(Double.toString(b1)); 
       return a2.multiply(b2).doubleValue(); 
      }

    4、相除

    public static double div(double a1, double b1, int scale) {
      if (scale < 0) { 
       throw new IllegalArgumentException("error"); 
      }
      BigDecimal a2 = new BigDecimal(Double.toString(a1)); 
      BigDecimal b2 = new BigDecimal(Double.toString(b1)); 
      return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); 
     }
  • 相关阅读:
    【Android】3.13 路径规划功能
    【Android】3.12 兴趣点( POI)搜索功能
    【Android】3.11 地理编码功能
    【Android】3.10 热力图功能
    【Android】3.9 覆盖物功能
    Java并发工具类之CountDownLatch
    GitHub项目加入Travis-CI的自动集成
    一种基于zookeeper的分布式队列的设计与实现
    常用的限流算法
    zookeeper客户端命令详解
  • 原文地址:https://www.cnblogs.com/SA226343/p/6945729.html
Copyright © 2011-2022 走看看