在涉及到货币等一些对精确度要求丝毫不差的运用场景中,我们往往会使用BigDecimal数据类型,在此以jdk 8为例。分别按浮点数、字符串方式创建BigDecimal,观察两者的差别,以明确使用方式。
示例代码如下:
BigDecimal d1=new BigDecimal(2.0);
BigDecimal d2=new BigDecimal(1.1);
System.out.println(d1.subtract(d2));
//this pattern used by bank system
BigDecimal d3=new BigDecimal("2.0");
BigDecimal d4=new BigDecimal("1.1");
System.out.println(d3.subtract(d4));
观察两次构造中的传入参数数据类型。
结果很容易就知道了,第一个输出中因为传入的是浮点数类型,而在计算机中的数据采用了二进制方式保存,这种方式无法保证数据的精准性,故而产生了精度丢失的情况。
输出结果如下:
0.899999999999999911182158029987476766109466552734375
0.9
来看看两者之间的构造函数:
public BigDecimal(double val) {
this(val,MathContext.UNLIMITED);
}
public BigDecimal(String val) {
this(val.toCharArray(), 0, val.length());
}
综上,想要达到精准精度的目标还是得采用字符串形式构造BigDecimal呢。