产生的背景:二进制表示十进制表示可能存在误差(例如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));
}
}