BigDecimal compareTo比较大小

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

1、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

2020年1月13日更新
可以使用字符串参数的构造方法来构造BigDecimal对象

System.out.println(new BigDecimal("1.15"));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容