1、Java中double、float 类型进行运算时精度丢失问题
代码中有dobule 类型的变量进行计算,出现精度丢失,如下代码:
public class Test22 {
@Test
public void test(){
double num1 = 2.55;
double num2 = 1.22;
System.out.println(num1-num2);
}
}
double 类型的num1-num2 并未得到理想中的1.33,计算结果出现了精度丢失。
2、原因
计算机计算是通过二进制进行计算,将十进制小数转为二进制小数时(整数部分除以2 取余,逆序排列,小数部分乘 2 取整数位,顺序排列),小数位可能会出现无限循环,但计算机能保存的小数位有限,只会截取部分小数进行存储,因此计算机根本无法精确表示某些浮点数,所以计算也就会出现问题。
3、解决办法
使用 java.math.BigDecimal进行计算
public class Test22 {
@Test
public void test(){
double d1 = 2.55d;
double d2 = 1.22d;
System.out.println(d1-d2);
BigDecimal b1= new BigDecimal(Double.toString(d1));
BigDecimal b2 = new BigDecimal(Double.toString(d2));
System.out.println("b1 - b2 = "+b1.subtract(b2));
}
}
4、BigDecimal类型数据计算、比较方式
(1)基础运算:
BigDecimal a = new BigDecimal("2.55");
BigDecimal b = new BigDecimal("1.22");
// ps:
// 1. a、b不能为空,否则抛异常;
// 2. 调用divide()时,最好指定保留几位小数,否则可能抛异常
// 加法
a.add(b);
// 减法
a.subtract(b);
// 乘法
a.multiply(b);
// 除法
a.divide(b);
ps:①基础运算时,a、b不能为空,否则抛异常;
②调用divide()时,最好指定保留几位小数,否则可能抛异常
(2)比较大小:
if(a.compareTo(b) == 0){
System.out.println("a=b");
}
if(a.compareTo(b) == 1){
System.out.println("a>b");
}
if(a.compareTo(b) == -1){
System.out.println("a<b");
}
if(a.compareTo(b) > -1){
System.out.println("a>=b");
}
if(a.compareTo(b) < 1){
System.out.println("a<=b");
}