使用BigDecimal来解决float、double计算时的精度丢失问题
首先看一个例子:
package BigDecimalDemo; public class Demo { public static void main(String[] args) { double d1 = 0.05; double d2 = 0.02; System.out.println(d1 - d2); } }
输出结果为:
0.030000000000000002
这是由于float、double类型在进行计算时存在精度丢失问题,那如何解决呢?
package BigDecimalDemo; import java.math.BigDecimal; public class Demo { public static void main(String[] args) { double d1 = 0.05; double d2 = 0.02; BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(d1)); BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(d2)); System.out.println(bigDecimal1.subtract(bigDecimal2).doubleValue()); } }
输出结果为:
0.03
但需要特别注意,一定要使用参数为string的构造函数,不然仍会有问题,如下:
package BigDecimalDemo; import java.math.BigDecimal; public class Demo { public static void main(String[] args) { double d1 = 0.05; double d2 = 0.02; BigDecimal bigDecimal1 = new BigDecimal(d1); BigDecimal bigDecimal2 = new BigDecimal(d2); System.out.println(bigDecimal1.subtract(bigDecimal2).doubleValue()); } }
输出结果为:
0.030000000000000002
另外,在比较BigDecimal是否相等时,看以下例子:
package BigDecimalDemo; import java.math.BigDecimal; public class CompareDemo { public static void main(String[] args) { BigDecimal bigDecimal1 = new BigDecimal("0.1"); BigDecimal bigDecimal2 = new BigDecimal("0.10"); System.out.println(bigDecimal1.equals(bigDecimal2)); System.out.println(bigDecimal1.compareTo(bigDecimal2)); } }
结果为:
false
0
0.1和0.10使用equals比较时是不相等的,而使用compareTo比较是相等的。