创建BigDecimal精度丢失问题

在涉及到货币等一些对精确度要求丝毫不差的运用场景中,我们往往会使用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呢。

发布了130 篇原创文章 · 获赞 39 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34901049/article/details/103835028