前言
我们都知道,在正常的商业计算使用中,采用Double和float类型进行精确计算是不可取的,会存在很多意想不到的错误,因此BigDecimal诞生了。BigDecimal除了有更高的精度之外,还可以创建一个更大的数。比如:int 的最大值是:2147483647,如果在想大的话就要用到BigDecimal了。
废话不多说了,下面是使用方法。
加减乘除
BigDecimal bignum1 = new BigDecimal("100"); BigDecimal bignum2 = new BigDecimal("20"); BigDecimal bignum3; //加法 bignum3 = bignum1.add(bignum2); System.out.println("加法:" + bignum3); //减法 bignum3 = bignum1.subtract(bignum2); System.out.println("减法:" + bignum3); //乘法 bignum3 = bignum1.multiply(bignum2); System.out.println("乘法:" + bignum3); //除法 bignum3 = bignum1.divide(bignum2); System.out.println("除法:" + bignum3);打印结果:
转Double、String、Integer
BigDecimal stringBigDecimal = new BigDecimal("3.1415926"); BigDecimal intBigDecimal = new BigDecimal("2190"); BigDecimal doubleBigDecimal = new BigDecimal("3.1415926"); //转换成 string数据类型 String stringValue=stringBigDecimal.toString(); System.out.println("转换成 string数据类型:"+stringValue); //转换成 int数据类型 Integer intValue=intBigDecimal.intValue(); System.out.println("转换成 int数据类型:"+intValue); //转换成 double数据类型 Double doubleValue=doubleBigDecimal.doubleValue(); System.out.println("转换成 double数据类型:"+doubleValue);打印结果:
保留小数点后两位
这里我举两种最常用的类型:四舍五入法和直接删除法
double d=3.1495926; String dValue=Double.toString(d); BigDecimal bg = new BigDecimal(dValue); //四舍五入法保留两位小数 double d1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); System.out.println(d1); //直接删除法保留两位小数 不考虑四舍五入,直接删除掉后面的数字 double d2 = bg.setScale(2, BigDecimal.ROUND_DOWN).doubleValue(); System.out.println(d2);打印结果:
这里有一个问题,上面两种方法是不会自动填充0的,比如3.1在保留两位小数后还是3.1并不会是3.10,所以我们还需要加入一步操作。
double d=3.1; String dValue=Double.toString(d); BigDecimal bg = new BigDecimal(dValue); //未补0的情况 double d1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); System.out.println("未补0的情况:"+d1); // 补0的情况 不足两位小数补0 DecimalFormat decimalFormat = new DecimalFormat("0.00#"); String d2 = decimalFormat.format(bg); System.out.println("补0的情况:"+d2);打印结果:
比较大小
BigDecimal是通过使用compareTo(BigDecimal)来比较大小的。返回值有三种情况
1 :大于 0 :等于 -1 :小于
示例:
BigDecimal a = new BigDecimal("1"); BigDecimal b = new BigDecimal("2"); BigDecimal c = new BigDecimal("1"); int result1 = a.compareTo(b); int result2 = a.compareTo(c); int result3 = b.compareTo(a); System.out.println(result1); System.out.println(result2); System.out.println(result3);打印结果:
构造
构造这里还真有点可说的,之前看过一篇博主的文章让我恍然大悟,今天我重新给大家总结一下(厚颜无耻的抄过来☺)
1.public BigDecimal(double val) 将double表示形式转换为BigDecimal *不建议使用
2.public BigDecimal(int val) 将int表示形式转换成BigDecimal
3.public BigDecimal(String val) 将String表示形式转换成BigDecimal
官方比较推荐第三种方法去创建,所以我上面的列子在使用Double转BigDecimal时都会先转换成String在转换成Double。
而为什么不能直接使用double转bigDecimal的原因我举例说明:
BigDecimal bigDecimal = new BigDecimal(2); BigDecimal bDouble = new BigDecimal(2.3); BigDecimal bString = new BigDecimal("2.3"); System.out.println("bigDecimal=" + bigDecimal); System.out.println("bDouble=" + bDouble); System.out.println("bString=" + bString);打印结果: 出现这种情况的原因:
JDK的描述中说:1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
小结
BigDecimal 的使用这里就说完了,当然还有很多没说到的方法大家只能去查看jdk文档了,这里只是列出了最常用的方法,大家可以收藏以备以后使用。另外 BigDecimal 虽好,但不要贪杯哦 BigDecimal 的内存占用比双精度的Double还要大,它由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成,用的太多会出现巨大的内存占用问题。
如果觉得有帮助的话给个免费的点赞吧,Thanks♪(・ω・)ノ