zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    Hive扩展功能(四)--HiveServer2服务
    Hive扩展功能(三)--使用UDF函数将Hive中的数据插入MySQL中
    Hive扩展功能(二)--HWI接口
    Hive扩展功能(一)--Parquet
    Flutter全局变量设置 (ScopedModel)
    PHP时间常用方法
    用iFrame Resizer解决iframe高度自适应问题
    aos.js超赞页面滚动元素动画jQuery动画库
    Jcrop最新手册
    jQuery Jcrop API参数说明(中文版)
  • 原文地址:https://www.cnblogs.com/xifenglou/p/9993289.html
Copyright © 2011-2022 走看看