BigDecimal的setScale()方法无效(坑)

最近在使用BigDecimal进行四舍五入时,发现setScale()方法设置的精度值并没有起作用,一度让我怀疑起是否jdk有bug,代码如下:

错误代码 
double d = 7.199999999999999; 
BigDecimal decimal = new BigDecimal(String.valueOf(d)); 
decimal.setScale(2, BigDecimal.ROUND_HALF_UP); 
System.out.println(decimal.scale()); 
System.out.println(decimal.doubleValue()); 
System.out.println(decimal.toString()); 
以上代码目的:将7.199999999999999保留两位小数后输出。 输出结果:

15 
7.199999999999999 
7.199999999999999 
可以看到,decimal.setScale(2, BigDecimal.ROUND_HALF_UP);并没有起作用。

正确代码 
double d = 7.199999999999999; 
BigDecimal decimal = new BigDecimal(String.valueOf(d)); 
//重新生成了新的对象 
BigDecimal decimal2 = decimal.setScale(2, BigDecimal.ROUND_HALF_UP); 
System.out.println(“—————decimal1————-“); 
System.out.println(decimal.scale()); 
System.out.println(decimal.doubleValue()); 
System.out.println(decimal.toString()); 
System.out.println(“—————decimal2————-“); 
System.out.println(decimal2.scale()); 
System.out.println(decimal2.doubleValue()); 
System.out.println(decimal2.toString()); 
与错误代码不同的是,用decimal2接收decimal.setScale(2, BigDecimal.ROUND_HALF_UP)的返回结果,并操作decimal2,输出如下:

—————decimal1————- 
15 
7.199999999999999 
7.199999999999999 
—————decimal2————- 

7.2 
7.20 
总结 
decimal.setScale(2, BigDecimal.ROUND_HALF_UP)会生成新的对象,设置的精度值只对新对象有效,对原对象无效,需注意。 一般来说,可以使用链式方式构造新对象并设置精度:

BigDecimal decimal = new BigDecimal(String.valueOf(d)).setScale(2, BigDecimal.ROUND_HALF_UP);

 

posted @ 2018-11-21 10:00  西凤楼  阅读(4249)  评论(0编辑  收藏  举报
如果,您认为阅读这篇博客让您有些收获, 如果,您希望更容易地发现我的新博客,不妨关注一下。因为,我的写作热情也离不开您的肯定支持。 感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客。 因为有小孩,兼职卖书,路过的朋友有需要低价购买图书、点读笔、纸尿裤等资源的,可扫最上方二维码,质量有保证,价格很美丽,欢迎咨询!