前言
我们都知道,在正常的商业计算使用中,采用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♪(・ω・)ノ