最近在使用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. MySQL并发相关的参数

    1.max_connections 这个参数可提高并发连接数,即允许连接到MySQL数据库的最大数量. 如果实验MySQL过程中遇到too many connections等问题,可提高这个值,此外我 ...

  2. MySQL基础之 视图

    视图 视图就是从一个表或多个表导出来的一张虚拟的表.通过这个窗口可以看到系统专门提供的数据,方便用户操作的同时增加了安全性. 视图的特点: 1.视图的列可以来自于不同的表. 2.视图是由实际存在的表创 ...

  3. 【Android自动化】测试系统的应用程序安装与卸载性能,判断长时间反复安装对系统的整体性能影响

    # -*- coding:utf-8 -*- import sys import os import time import subprocess from uiautomator import de ...

  4. 3.7 AnsyncTask异步任务

    3.7 AnsyncTask异步任务. 1)为什么要用AsyncTask? 答: 我们可以用上述两种方法来完成我们的异步操作,加入要我们写的异步操作比较多,或者较为繁琐, 难道我们new Thread ...

  5. Mac svn使用学习-4-客户端cli命令详解

    客户端cli的使用 WC:Working Copy 你的工作区 将文件或目录版本化,这样下一次提交到存储库的时候,他们就都会被提交上去.能实现版本化的命令有: add 1.import 是否访问存储库 ...

  6. shiro实战系列(六)之Authorization(授权)

    授权,又称作为访问控制,是对资源的访问管理的过程.换句话说,控制谁有权限在应用程序中做什么. 授权检查的例子是:该用户是否被允许访问这个网页,编辑此数据,查看此按钮,或打印到这台打印机?这些都是 决定 ...

  7. PAT B1027 打印沙漏 (20 分)

    本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐:相邻两 ...

  8. Python2.7-array

    array 模块,定义了 array 对象的一组数据,和 list 类似,只不过 array 对象的数据类型不能改变,和c/c++一样,主要用于打包和解包二进制数据,应该是用于网络通信较多 数据类型有 ...

  9. CAN调度理论与实践分析

    CAN调度理论与实践分析 分布式嵌入式系统是当前嵌入式系统的重要发展方向,因为它能提供更强的性能,节约系统的总体成本.但是由于各单个节点必须有通信网络相连才能协调地工作,网络就成了关键部分,没有网络提 ...

  10. Linux线程的信号量同步

    信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区. 不多做解释,要使用信号量同步,需要包含头文件semaphore.h. 主要用到的函数: int ...