1.为啥要使用BigDecimal 就是因为数据太大涉及精度问题比如3000000000,有一点吐槽的就是你设置为BigDecimal接收的数据不能是null 不然会报错。
2.BigDecimal基本了解
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用 精度不准确
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用
3.方法描述
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。
a1.compareTo(a2) a1大于a2返回1 a1等于a2返回0 a1小于a2返回-1
BigDecimal b1 = new BigDecimal(0.1);
BigDecimal b2 = new BigDecimal(0.2);
int c = b1.compareTo(b2); // -1
c=1表示b1大于b2
c=0表示b1等于b2
c=-1表示b1小于b2
4.截断和四舍五入可用setScale方法 第一个参数保留几位小数 第二个参数取值模式
BigDecimal big = new BigDecimal("2.3355");
big = big.setScale(2, RoundingMode.HALF_UP);//保留两位 四舍五入
Log.d(TAG, "convert: "+big);//输出2.34
5.取值模式
BigDecimal.ROUND_UP
无条件进1,1.01 ->1.1
BigDecimal.ROUND_DOWN
无条件舍弃,1.09 -> 1.0
BigDecimal.ROUND_HALF_UP
四舍五入
BigDecimal.ROUND_HALF_DOWN
五舍六入,即舍弃部分大于等于6才会进1
BigDecimal.ROUND_CEILING
向正无穷方向舍弃,1.01 -> 1.1
BigDecimal.ROUND_FLOOR
向负无穷方向舍弃,1.09 -> 1.0
BigDecimal.ROUND_HALF_EVEN
当舍弃部分的左边是奇数时,表现同ROUND_HALF_UP(四舍五入)
当舍弃部分的左边是偶数时,表现同ROUND_HALF_DOWN(五舍六入)
BigDecimal.ROUND_UNNECESSARY
Assert操作,证明计算是准确的,不需要round
System.out.println(new BigDecimal(1.25).setScale(1, BigDecimal.ROUND_HALF_UP).setScale(1, BigDecimal.ROUND_UNNECESSARY));
6、0.1 * 0.2 != 0.02
BigDecimal b1 = new BigDecimal(0.1);
BigDecimal b2 = new BigDecimal(0.2);
BigDecimal b3 = new BigDecimal(0.02);
System.out.println(b1.multiply(b2));
System.out.println(b1.multiply(b2).compareTo(b3));
打印结果是
0.0200000000000000022204460492503131424770215565731879227912941627176741932192527428924222476780414581298828125
1
原因是后面有一堆 的小数位
BigDecimal b3 = new BigDecimal(0.02);
System.out.println(b3); // 0.0200000000000000004163336342344337026588618755340576171875
2、0.1 * 0.2 == 0.02 设置精度后再作计算
BigDecimal b1 = new BigDecimal(0.1).setScale(2, BigDecimal.ROUND_HALF_DOWN);
BigDecimal b2 = new BigDecimal(0.2).setScale(2, BigDecimal.ROUND_HALF_DOWN);
BigDecimal b3 = new BigDecimal(0.02).setScale(2, BigDecimal.ROUND_HALF_DOWN);
System.out.println(b1.multiply(b2).compareTo(b3) == 0);
打印结果
true
3、BigDecimal的round模式
BigDecimal.ROUND_UP
无条件进1,1.01 ->1.1
BigDecimal.ROUND_DOWN
无条件舍弃,1.09 -> 1.0
BigDecimal.ROUND_HALF_UP
四舍五入
BigDecimal.ROUND_HALF_DOWN
五舍六入,即舍弃部分大于等于6才会进1
BigDecimal.ROUND_CEILING
向正无穷方向舍弃,1.01 -> 1.1
BigDecimal.ROUND_FLOOR
向负无穷方向舍弃,1.09 -> 1.0
BigDecimal.ROUND_HALF_EVEN
当舍弃部分的左边是奇数时,表现同ROUND_HALF_UP(四舍五入)
当舍弃部分的左边是偶数时,表现同ROUND_HALF_DOWN(五舍六入)
BigDecimal.ROUND_UNNECESSARY
Assert操作,证明计算是准确的,不需要round
System.out.println(new BigDecimal(1.25).setScale(1, BigDecimal.ROUND_HALF_UP).setScale(1, BigDecimal.ROUND_UNNECESSARY));
4、BigDecimal.ROUND_UP和BigDecimal.ROUND_CEILING和区别?
在正数情况下,表现一致,负数情况下,表现不同
ROUND_UP -1.01 -> -1.1
ROUND_CEILING -1.01 -> -1.0
5、为什么BigDecimal.ROUND_HALF_UP和BigDecimal.ROUND_HALF_DOWN没有举例? 以ROUND_HALF_UP举例:
BigDecimal b1 = new BigDecimal(1.15).setScale(1, BigDecimal.ROUND_HALF_UP);
BigDecimal b2 = new BigDecimal(1.25).setScale(1, BigDecimal.ROUND_HALF_UP);
System.out.println(b1);
System.out.println(b2);
打印结果
1.1
1.3
这里1.15没有和预想的一样进1,千万不要怀疑系统有问题,打印1.15和1.25的值就明白了
BigDecimal b1 = new BigDecimal(1.15);
BigDecimal b2 = new BigDecimal(1.25);
System.out.println(b1);
System.out.println(b2);
打印结果
1.149999999999999911182158029987476766109466552734375
1.25
0.049999999999999911182158029987476766109466552734375确实小于0.05
文章来源地址https://www.toymoban.com/news/detail-611845.html
文章来源:https://www.toymoban.com/news/detail-611845.html
到了这里,关于BigDecimal的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!