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

BigDecimal的setScale()方法无效(坑)的更多相关文章

  1. java - BigDecimal的format()方法和setScale()方法格式字符串

    1.BigDecimal.setScale()方法用于格式化小数点 setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接删 ...

  2. java取整和java四舍五入方法 BigDecimal.setScale()方法详解

    import java.math.BigDecimal; public class TestGetInt { public static void main(String[] args) { doub ...

  3. [Q&A] 类Range的PasteSpecial方法无效

    环境说明: VS2013(C#) + Office2013 Bug说明: range1.Copy(Type.Missing); range2.PasteSpecial(Excel.XlPasteTyp ...

  4. java BigDecimal add 等方法遇到的问题

    //这篇随笔是为了提醒自己避免重复错误 //原先的代码是这样的,想着输出会是9.00,可是结果却是0.00 BigDecimal day_fee = new BigDecimal("0.00 ...

  5. Excel 使用AutoFill提示“类Range的AutoFill方法无效”

    今天遇到一个神奇的问题,之前一直使用很好的代码突然报错:“类Range的AutoFill方法无效”,在网上搜索了一番,感觉没有一个与我遇到的情况相同的.debug,查看一下代码,发现程序里,AutoF ...

  6. 在IE中,JS方法名和input的name重名时,调用该方法无效

    在IE中,JS方法名和input的name重名时,调用该方法无效.提示:网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1 ...

  7. JQ绑定事件的叠加和解决,index()方法的坑

    JQ绑定事件的叠加和解决,index()方法的坑 前言 在做过几个不大不小的项目后,发现技术这种东西,必须要多多实践,才能发现各种问题,理论的知识掌握的再好终究是纸上谈兵. 因此目前感觉有两点是必须要 ...

  8. BigDecimal的setScale常用方法(ROUND_UP、ROUND_DOWN、ROUND_HALF_UP、ROUND_HALF_DOWN)

    BigDecimal的setScale四大常用方法总结 // 设置小数点后第三位数字一大一小观察效果BigDecimal num = new BigDecimal("3.3235667&qu ...

  9. 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?

    GitHub 17k Star 的Java工程师成神之路,不来了解一下吗! GitHub 17k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 17k Star 的Java工 ...

随机推荐

  1. jsencrypt加密

    在登录时,前台页面的用户名.密码都是明文传输到后台的,漏洞扫描认为这样子不安全,就想到了前台js加密,后台解密的方法,要用到jsencrypt.js,具体代码如下: 前台页面: <!DOCTYP ...

  2. Hash问题----Hash强碰撞

    包含内容:hellowword,byeworld文件md5,pdf1,2的sha1值. 等待笔记...

  3. 团队作业——Alpha冲刺 6/12

    团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:编辑界面完成标题栏的开发,以及与已经完成gallery开发的同学,商讨我负责的界面中,图片滑动的具体措施. 明日任务:除了图像识别内容嵌入 ...

  4. Netty入门(五)ChanneHandler

    本节主要讨论了 Netty 的数据处理组件 ChannelHandler. 一.Channel 生命周期 Channel 有个简单但强大的状态模型,下面是 Channel 的四个状态: Channel ...

  5. Please select Android SDK解决办法

    项目不能运行,提示如下  打开项目local.properties文件,查看sdk地址是否正确,注意区分大小写  如果sdk地址正确,那么点击File-Sync Project with gradle ...

  6. 洛谷P4053 [JSOI2007]建筑抢修

    放题解 题目传送门 放代码 #include <bits/stdc++.h>//万能头 #define MAXN 150000//最多的建筑数量(数据范围) using namespace ...

  7. OpenCV——直方图计算、寻早最值位置和对比匹配(判断两幅图的相似程度)

  8. PAT B1035 插入与归并 (25 分)

    根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...

  9. Python 函数(一)

    Python3 函数(基本概念) 1.概念: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段:通过函数,可以对特定功能的代码进行封装,实现代码的复用. 2. 5.参数传递 (1) P ...

  10. C++之友元函数和友元类

    通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当前类的友元函数. #include<iostream>using namespace std; ...