龙空技术网

Java面试题之BigDecimal 初始化赋值方式

软件架构 2943

前言:

目前姐妹们对“decimaljava”都比较看重,同学们都想要剖析一些“decimaljava”的相关资讯。那么小编在网上汇集了一些有关“decimaljava””的相关知识,希望你们能喜欢,你们一起来学习一下吧!

BigDecimal类

对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。

上述代码输出结果:

0.1000000000000000055511151231257827021181583404541015625

0.1

分析过程

BigDecimal a = new BigDecimal(0.1);

上述代码说明:事实上,由于二进制无法精确地表示十进制小数0.1,但是编译器读到 0.1之后,必须把它转成8个字节的double值,因此,编译器只能用一个最接近的值来代替0.1了,即0.1000000000000000055511151231257827021181583404541015625。因此,在运行时,传给BigDecimal构造函数的真正的数值是0.1000000000000000055511151231257827021181583404541015625。

如果你希望BigDecimal能够精确地表示你希望的数值,那么一定要使用字符串来表示小数,并传递给BigDecimal的构造函数。

总结一下

1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入new BigDecimal(0.1)所创建的BigDecimal正好等于 0.1,但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

2、另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。

进一步延伸

下面这段代码的输出值:

BigDecimal a1 = new BigDecimal("1.0");

BigDecimal a2 = new BigDecimal("0.9");

BigDecimal a3 = new BigDecimal("0.8");

if(a1.subtract(a2).equals(a2.subtract(a3))) {

System.out.println("true");

} else {

System.out.println("flase");

}

输出结果:true

完整代码如下所示:

对代码做一下调整,传入double 类型参数,看看输出结果:

标签: #decimaljava