java中BigDecimal的学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中BigDecimal的学习相关的知识,希望对你有一定的参考价值。

干着java的活,但是看的都是一些偏底层的东西(或者我根本就没有看),有点荒废了java的学习。

最近一直在用到一个类是BigDecimal,但都是模棱两可地在那儿用,并没有深入研究这个类的细节,感觉不能再拖了。

BigDecimal,从名字来看就是进行大数运算的,不光这样,还广泛用于小数的精确运算。

当你接触到和钱有关的计算的时候,这个类还是很有用滴。

先来看一个例子

 1 package com.tuhooo.bigdecimal;
 2 
 3 /**
 4  * Created by tuhooo on 2017/8/21.
 5  */
 6 public class Demo1 {
 7     public static void main(String[] args) {
 8         System.out.println(0.06 + 0.01);
 9         System.out.println(1.002 - 0.4);
10         System.out.println(4.015 * 100);
11         System.out.println(333.1 / 500);
12     }
13 }

讲道理,上面的运算都还没有涉及到无限循环小数呢,但是计算机给出的计算结果却是这样滴:

技术分享

其实原因很简单,计算机的表示数的精度是有限滴,计算机底层用二进制来表示数据的时候,尤其是小数的时候精度更不好。

think about that,尼玛,这种运算要是出现在和钱有关的地方,说高达上点就是金融有关的话,是不能接受的。

java中提供了一个很好的类——BigDecimal来解决这个问题。

 1 package com.tuhooo.bigdecimal;
 2 
 3 import java.math.BigDecimal;
 4 
 5 /**
 6  * Created by tuhooo on 2017/8/21.
 7  */
 8 public class Demo2 {
 9     public static void main(String[] args) {
10         System.out.println(new BigDecimal("0.06").add(new BigDecimal("0.01")));
11         System.out.println(new BigDecimal("1.002").subtract(new BigDecimal("0.4")));
12         System.out.println(new BigDecimal("4.015").multiply(new BigDecimal("100")));
13         System.out.println(new BigDecimal("333.1").divide(new BigDecimal("500")));
14     }
15 }

看接下来的效果:

技术分享

再来看一个例子:

 1 package com.tuhooo.bigdecimal;
 2 
 3 import java.math.BigDecimal;
 4 
 5 /**
 6  * Created by tuhooo on 2017/8/21.
 7  */
 8 public class Demo3 {
 9     public static void main(String[] args) {
10         System.out.println(new BigDecimal(0.06).add(new BigDecimal(0.01)));
11         System.out.println(new BigDecimal(1.002).subtract(new BigDecimal(0.4)));
12         System.out.println(new BigDecimal(4.015).multiply(new BigDecimal(100)));
13         System.out.println(new BigDecimal(333.1).divide(new BigDecimal(500)));
14     }
15 }

技术分享

这里可以发现,并不是用了BigDecimal就会有效果的,和BigDecimal的构造方式也有关系

to be continued......

 

以上是关于java中BigDecimal的学习的主要内容,如果未能解决你的问题,请参考以下文章

java中BigDecimal如何求余(即实现%的功能),求代码

如何在java代码中使用elasticsearch painless BigDecimal?

java SpringRetry学习的代码片段

Java学习笔记26(Math类Arrays类BigInteger类BigDecimal类)

Java中BigDecimal的8种舍入模式是怎样的

在 Java 中使用 BigDecimal 手动 Math.pow