关于BigDecimal

我们都知道,在java中浮点数由double与float表示,他们在计算的时候会出现精度问题,比如

关于BigDecimal_第1张图片

我们期望得到的结果是2.03,结果却得到了不精确的数字,这个涉及到计算机原理,不详细展开。因为不精确的关系,当涉及到钱的计算时,我们便不能使用double或者float进行计算,这时我们需要使用BigDecimal。

BigDecimal的构造

但是BigDecimal一定是精确的吗?

关于BigDecimal_第2张图片

我们使用BigDecimal的double类型的构造参数生成对象在进行相加,发现得到的结果也并不精确,api中给出的解决方案是使用string类型的构造函数。所以这里我们需要注意的是直接使用new 的方式构建对象的时候需要使用string类型的构造函数才能保证精确。更好一点的做法是使用静态方法valueOf进行初始化。

关于BigDecimal_第3张图片

可以看到他最后也是使用了string类型的构造函数的构造函数进行了初始化。这时再来看计算结果,发现结果是精确的。

关于BigDecimal_第4张图片

使用valueof方法还有一个好处

关于BigDecimal_第5张图片

BigDecimal的比较

BigDecimal重写了equals方法方便我们进行大小的比较,然而equals不仅会比较大小,还会进行精度的比较,当我们使用string类型额构造函数进行构造时,添加了多余的0,发现c与d并不相等。而compareTo方法则只会进行大小的比较,与精度无关。当使用valueof方法进行构造时,他会帮我们去掉多余的精度,这样使用equals方法进行比较时也不会发生错误。但是在比较大小的时候还是推荐使用compareTo方法进行比较。

几个常量

BigDecimal预置了3个常用的数字供我们使用,分别是0,1,10.对应到类分别为BigDecimal.ZERO,BigDecimal.ONE,BigDecimal.TEN,他们的精度都是0。若我们使用到以上几个数字,尽量使用类预置的常量。

BigDecimal的toString

关于BigDecimal_第6张图片

BigDecimal提供了3个toString方法,自己喜欢使用toPlanString,即不使用指数的形式进行输出,toString则是当位数超过一定数量使用指数形式,toEngineeringString则是使用工程模式进行输出。

BigDecimal的其他方法基本就是常用的加减乘除等操作了,这里就不介绍了。

你可能感兴趣的:(关于BigDecimal)