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(); 
     }
  • 相关阅读:
    我要自学网asp.net学习第一天(课程概述)
    在eclipse中创建web项目(非myeclipse)
    2015-11-04 报表(c#部分)(Datatable 查询,弹出日期控件,输入是否整数)
    2015-11-04 asp.net 弹出式日历控件 选择日期 Calendar控件
    JSP 资源与网站
    2015-09-17 001 存储过程数据操作类 H_data_Helper
    2015-09-17 001 日志与对话框公用类_public
    20150916_018 插入行()
    20150916_001 vba 基础
    20150825 C# 调用带参数的存储过程 模板
  • 原文地址:https://www.cnblogs.com/SA226343/p/6945729.html
Copyright © 2011-2022 走看看