zoukankan      html  css  js  c++  java
  • Java 学习笔记---Java double类型相加问题

    多个double类型的数直接相加的时候,可能存在精度误差.( 由于计算机算法以及硬件环境决定只能识别 0 1。计算机默认的计算结果在都在一个指定精度范围之内,想往深的了解,可以学习数值分析等) 在金融方面是绝对不允许的,好在java开发者有这个先见之明。 java.math.*里面提供了BigDecimal类(提供高精度计算的方法)

    这个时候就要采用BigDecimal函数进行运算
    第一步、建立String类型的数据
    第二步、创建BigDecimal对象BigDecimal(Double.toString(double))
    以下两种不推荐:
    BigDecimal(double)或者BigDecimal(Double.valueOf(double)))

    建议: 涉及到精度问题的时候,整个计算过程都是用String类型或者BigDecimal类对象。最后结果根据需求 在转过来。

    另外该文章提供了一个计算辅助类Java Double相加出现的怪事
    急需的话,直接学习、创建该工具类,就可以完成项目了。以下是 加法算法的几个实现的方法。

    new BigDecimal(Double.toString(double)).add(new BigDecimal(Double.toString(double));
    1
    /**
    * @param b1
    * BigDecimal
    * @param v2
    * double
    * @return BigDecimal
    * */
    public BigDecimal add(BigDecimal b1, double v2) {
    // BigDecimal b1=new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.add(b2);
    }

    /**
    * @param b1
    * double
    * @param v2
    * double
    * @return BigDecimal
    * */
    public BigDecimal add(double v1, double v2) {
    BigDecimal b1=new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.add(b2);
    }

    /**
    * @param b1
    * double
    * @param v2
    * double
    * @return double
    * */
    public double add(double v1, double v2) {
    BigDecimal b1=new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.add(b2).doubleValue();
    }

    结论是:
    BigDecimal的算法精度比较好。 其余两种方法 都存在缺点。至于strictfp 这个关键字 是去平台化影响。比如32为机器和64位机器结果都一样。 对于精度计算结果影响不大。

  • 相关阅读:
    实现PHP Thread基类
    完美实现PHP多线程
    Centos操作记录(一)
    Centos Minimal7 安装问题
    Server Git开发流程
    APP Git协作流程
    git学习笔记
    CentOS安装Nginx
    C++学习笔记(一)
    sql进阶:分组查询、子查询、连接查询
  • 原文地址:https://www.cnblogs.com/taiyanhong/p/8692580.html
Copyright © 2011-2022 走看看