产生的背景:二进制表示十进制表示可能存在误差(例如0.1的十进制数字用二进制会产生误差) 解决问问题的方法:核心思想是十进制整数转化为二进制的表示时不会产生问题,那么我们就可以将十进制的小数转化为放大为N倍数后的整数,并且保留相应的精度信息,这样的转化就可以准确的表述。

package com.ydlclass.math;

import java.math.BigDecimal;

public class BigDecimalTest {
    public static void main(String[] args) {
        //构造器,BigDecimal(int),BigDecimal(double),BigDecimal(string),BigDecimal(long ),我们最长使用BigDecimal(string)来做float数的计算
        //方法:add(BigDecimal),subtract(BigDecimal),mutiply(BigDecimal),devide(BigDecimal)
        //获取值的方法doublevalue(),longvalue(),floatvalue(),intvalue()
        System.out.println(0.1+0.2);

        BigDecimal bigDecimal = new BigDecimal(0.1);
        System.out.println(bigDecimal);//这种方式其实依旧存在精度误差的问题

        BigDecimal bigDecimal1 = new BigDecimal("0.1");
        BigDecimal add = bigDecimal1.add(new BigDecimal("0.2"));
        System.out.println(add);//这种方式的计算就避免了精度误差的问题
        System.out.println("add.doubleValue() = " + add.doubleValue());



    }
}

使用bigdecimal这个提供好的一个类,我们可以手写一个自己的用于计算的一个计算类

例如一个简单的工具类:

package com.ydlclass.math;

import java.math.BigDecimal;

public class CalculateUtil {
    public static double plus(double n1,double n2){
        //每个基础数据类型都存在一个包装类,这个包装类有许多的方法,这些方法可以帮助我们转化技术数据类型
        BigDecimal bigDecimal = new BigDecimal(Double.toString(n1));

//        double v = Double.parseDouble("12.3");//说明包装类存在着这样的方法可以将字符串转化为基础数据类型


        return (bigDecimal.add(new BigDecimal(Double.toString(n2)))).doubleValue();


    }

    public static void main(String[] args) {
        System.out.println("CalculateUtil.plus(12.3,131.2) = " + CalculateUtil.plus(12.3, 131.2));

    }
}