Java用BigDecimal如何解决double类型相减时可能存在的误差

这篇文章主要讲解了Java用BigDecimal如何解决double类型相减时可能存在的误差,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

创新互联公司长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为徐水企业提供专业的成都网站建设、成都网站设计,徐水网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。

double类型的两个数相减可能存在误差,比如System.out.println(2099 - 1999.9);的结果为99.09999999999991

可以用BigDecimal解决:

public class TestDouble {
  //两个Double数相减
  public static Double sub(Double d1, Double d2) {
    if (d1 == null || d2 == null) {
      return null;
    }
    BigDecimal b1 = new BigDecimal(d1.toString());
    BigDecimal b2 = new BigDecimal(d2.toString());
    return b1.subtract(b2).doubleValue();
  }
 
  //两个Double数相加
  public static Double add(Double d1, Double d2) {
    if (d1 == null || d2 == null) {
      return null;
    }
    BigDecimal b1 = new BigDecimal(d1.toString());
    BigDecimal b2 = new BigDecimal(d2.toString());
    return b1.add(b2).doubleValue();
  }
 
  //两个Double数相除,并保留scale位小数
  public static Double div(Double d1, Double d2, int scale) {
    if (d1 == null || d2 == null || scale < 0) {
      return null;
    }
    BigDecimal b1 = new BigDecimal(d1.toString());
    BigDecimal b2 = new BigDecimal(d2.toString());
    return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  }
 
  // 两个Double数相乘
  public static Double mul(Double d1, Double d2) {
    if (d1 == null || d2 == null) {
      return null;
    }
    BigDecimal b1 = new BigDecimal(d1.toString());
    BigDecimal b2 = new BigDecimal(d2.toString());
    return b1.multiply(b2).doubleValue();
  }
 
  /**
   * 遇到.5的情况时往上近似
   *
   * @param d
   * @param scale
   * @return
   */
  public static Double setDoubleScale(Double d, int scale) {
    if (d == null || scale < 0) {
      return null;
    }
    BigDecimal b = new BigDecimal(d);
    return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  }
 
  public static void main(String[] args) {
    Double d1 = 2099d;
    Double d2 = 1999.999;
    System.out.println(d1 - d2);
    System.out.println(sub(d1, d2));
    System.out.println("------------------------------------");
    System.out.println(d1 * d2);
    System.out.println(mul(d1, d2));
    System.out.println("------------------------------------");
    System.out.println(d1/d2);
    System.out.println(div(d1,d2,4));
 
  }
}

结果:

99.00099999999998
99.001
------------------------------------
4197997.901
4197997.901
------------------------------------
1.0495005247502625
1.0495

看完上述内容,是不是对Java用BigDecimal如何解决double类型相减时可能存在的误差有进一步的了解,如果还想学习更多内容,欢迎关注创新互联行业资讯频道。

文章标题:Java用BigDecimal如何解决double类型相减时可能存在的误差
当前路径:https://www.cdcxhl.com/article42/jhciec.html

成都网站建设公司_创新互联,为您提供云服务器网站排名商城网站手机网站建设做网站自适应网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站制作