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位机器结果都一样。 对于精度计算结果影响不大。

  • 相关阅读:
    node 随手记录
    node 调试器
    GIT
    原型
    ES6 (11):Class
    ES6 (10):Generator
    集合框架02
    集合框架01
    实现各种尺寸的图片裁剪成圆形头像
    鼠标移上显示 ( 自定义内容 ) 弹出框
  • 原文地址:https://www.cnblogs.com/taiyanhong/p/8692580.html
Copyright © 2011-2022 走看看