最近在使用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);

最新文章

  1. nginx-my
  2. [moka同学笔记]Yii2 数据操作Query Builder
  3. ios协议调起app
  4. javax.mail.MessagingException: 501 Syntax: HELO hostname Linux端异常解决
  5. 【Android】数据存储-SharedPreferences存储
  6. taglib的使用
  7. c++ namespace命名空间详解
  8. poj 2774 最长公共子串 后缀数组
  9. vue-router路径计算问题
  10. https创建请求UrL报错: 未能为 SSL/TLS 安全通道建立信任关系
  11. 莫烦keras学习自修第二天【backend配置】
  12. java和python对比----1:
  13. C# 之 判断一个字符是否是汉字
  14. Docker入门 - 003 Docker 实例
  15. 推荐一个spring cloud 学习路线,绝对合理化
  16. solr跨core查询
  17. Bzoj4044 Virus synthesis
  18. CSectsInfomation.h文件
  19. POJ 2777 Count Color(线段树 + 染色问题)
  20. 数据库学习笔记 (三) python操作数据库

热门文章

  1. Vue.js Is Good, but Is It Better Than Angular or React?
  2. 通过sqli-labs学习sql注入——基础挑战之less1-3
  3. SDN负载均衡
  4. 【项目 · Wonderland】UML设计
  5. 【干货】一文理解Druid原理架构(时序数据库,不是ali的数据库连接池)
  6. Redis系列五:redis键管理和redis数据库管理
  7. ES6标准简介之Babel转码器解说
  8. 解决The SDK platform-tools version ((23)) is too old to check APIs compiled with API 23
  9. CentOS7服务器添加新用户
  10. jsonp小案例