最近在使用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————-
2
7.2
7.20
总结
decimal.setScale(2, BigDecimal.ROUND_HALF_UP)会生成新的对象,设置的精度值只对新对象有效,对原对象无效,需注意。 一般来说,可以使用链式方式构造新对象并设置精度:
BigDecimal decimal = new BigDecimal(String.valueOf(d)).setScale(2, BigDecimal.ROUND_HALF_UP);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179918.html原文链接:https://javaforall.cn