问题
如何解决Java中的double精度缺失问题呢?
在我们平常编写Java代码的过程中经常会遇到double类型的数据会有精度缺失的问题,例如:
public class Double2Decimal {
public static void main(String[] args) {
double c = 27.33;
System.out.println("c*5 = " + c*5);
}
}
结果:
原本的结果应该是136.65
,但是结果却是136.64999...98
,可能会有人说这是计算结果的问题,但是并不是。这里只是显示的问题,计算的结果是正确的,而这些精度缺失问题也是不可避免
的,该如何去解决呢?这就需要使用Java为我们提供的BigDecimal类型了。
解决
在解决精度缺失问题的时候我们可以将我们要计算的数放入绝对精度的BigDecimal中,通过BigDecimal中的方法进行计算。
解决精度问题将double类型的数据转换成BigDecimal类型有以下两种方法:
- 通过BigDecimal中的valueOf方法
代码:
public class Double2Decimal {
public static void main(String[] args) {
double c = 27.33;
System.out.println("c*5 = " + c*5);
//BigDecimal c1 = new BigDecimal(c); //计算结果:136.6499999999999914734871708787977695465087890625
BigDecimal bigDecimal = BigDecimal.valueOf(c);
BigDecimal multiply = bigDecimal.multiply(new BigDecimal(5.0));
System.out.println("multiply = " + multiply);
BigDecimal decimal = bigDecimal.multiply(new BigDecimal(21414123.5));
System.out.println("decimal = " + decimal);
}
}
结果:
- 通过将double类型的数转换成字符串
在BigDecimal的底层是使用的字符串进行的运算,所以我们需要将都类型的数转换成字符串在进行运算
代码:
public class Double2Decimal {
public static void main(String[] args) {
double c = 27.33;
System.out.println("c*5 = " + c*5);
//BigDecimal c1 = new BigDecimal(c); //计算结果:136.6499999999999914734871708787977695465087890625
BigDecimal c1 = new BigDecimal(c+"");
BigDecimal number = c1.multiply(new BigDecimal(5.0));
System.out.println("number = " + number);
}
}
结果: