Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。对于Double类型的运算,通常使用此类处理,来有效避免精度问题。
下面,我们从五个功能点,细说BigDecimal使用方法和注意事项:

正文:

基本运算

加减乘除方法返回的是BigDecimal型数据:.add(),.subtract(),.multiply(),.divide();

 //基本运算@Testpublic void testBasicOperation() {BigDecimal num1 = new BigDecimal("23");BigDecimal num2 = new BigDecimal("0.01");BigDecimal num3 = new BigDecimal("0");//加法System.out.println("add="+num1.add(num2));//减法System.out.println("subtract="+num1.subtract(num2));//乘法System.out.println("multiply="+num1.multiply(num2));//除法(注意,后面一定要跟精度,否则会报ArithmeticException异常)try {System.out.println("divide="+num1.divide(num3,3, BigDecimal.ROUND_HALF_UP));} catch (Exception e) {e.printStackTrace();}}
比较大小

compareTo方法返回的是一个int型数据:-1 小于; 0 等于; 1 大于。

 //比较大小@Testpublic void testCompare() {BigDecimal com1 = new BigDecimal("52");BigDecimal com2 = new BigDecimal("27");System.out.println("compare="+com1.compareTo(com2));//返回int型数据: -1 小于; 0 等于; 1 大于}
舍位计算

setScale(scale,roundingMode)方法中:scale表示精确位数,roundingMode表示舍入模式;

 //舍位@Testpublic void testCarry() {BigDecimal bigNum = new BigDecimal("2.35");       //进位处理,2.35变成2.4 System.out.println("ROUND_UP:"+bigNum.setScale(1,BigDecimal.ROUND_UP));   //直接删除多余的小数位,如2.35会变成2.3 System.out.println("ROUND_DOWN:"+bigNum.setScale(1,BigDecimal.ROUND_DOWN));   //四舍五入,2.35变成2.4System.out.println("ROUND_HALF_UP:"+bigNum.setScale(1,BigDecimal.ROUND_HALF_UP));//五舍六入,2.35变成2.3System.out.println("ROUND_HALF_DOWN:"+bigNum.setScale(1,BigDecimal.ROUND_HALF_DOWN));//不建议使用的.setScale(1)方法System.out.println("setScale:"+bigNum.setScale(2));}
格式化

NumberFormat(),DecimalFormat():可以通过自定义方式,限制输出数据的类型和精度,就像定义时间的Formate方法一样;

 //格式化@Testpublic void testNumFormat() {//NumberFormatNumberFormat currency = NumberFormat.getCurrencyInstance();  //建立"货币"格式化引用NumberFormat percent = NumberFormat.getPercentInstance();       //建立"百分比"格式化引用percent.setMaximumFractionDigits(3);                            //设置百分比小数点最多3位BigDecimal loanAmount = new BigDecimal("520.27");              //贷款金额BigDecimal interestRate = new BigDecimal("0.0041");            //利率BigDecimal interest = loanAmount.multiply(interestRate);       //计算乘积System.out.println("贷款金额:\t" + currency.format(loanAmount)); //贷款金额: ¥520.27System.out.println("利率:\t" + percent.format(interestRate));      //利率: 0.41%System.out.println("利息:\t" + currency.format(interest));      //利息:   ¥2.13//DecimalFormatDecimalFormat df = new DecimalFormat();double data = 1234.56789;                       //格式化之前的数字String style = "0.0";                          //定义要显示的数字的格式(这种方式自动四舍五入)df.applyPattern(style);System.out.println("DecimalFormat格式化以后:\t" + df.format(data));     //1234.6}
科学计数

toPlainString()方法返回String类型数据:可将Excel表格中导入的科学计数法轻松地转换成十进制数;

 @Testpublic void testScientificNotation() {BigDecimal plainNum = new BigDecimal("3.1415926E10");String result = plainNum.toPlainString();System.out.println("科学计数:\t" + result);        //科学计数:31415926000}

注意事项:

  1. BigDecimal的加减乘除操作,其实最终返回的都是一个新的BigDecimal对象,因为BigDecimal都是不可变的的(BigInteger同理);
  2. 如果用BigDecimal做除法,一定要在divide()方法中传递第二个参数scale,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出ArithmeticException异常。

小结:

  1. 凡是涉及到精确计算的地方,要使用BigDecimal;
  2. 建议每个项目中,都要提前准备一个BigDecimal计算的utils类;
  3. 尽量使用参数类型为String的构造函数,避免计算误差(即使是Double数据,其实也是先被toString处理了);
  4. BigDecimal是不可变的,在进行每一步运算时,都会产生一个新的对象。

更多精彩,请关注我的"今日头条号":Java云笔记
随时随地,让你拥有更新,更便捷的掌上云服务

Java中BigDecimal类的使用方法详解,常用最全系列!相关推荐

  1. Java中BigInteger类的使用方法详解,常用最全系列!

    原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 在 Java 中,有许多数字处理的类,比如 Integer类,但是Integer类有一定的局限性. 我们都知道 Integer 是 Int ...

  2. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

  3. Python的Django框架中forms表单类的使用方法详解2

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  4. Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释

    Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...

  5. Java 中Date类getTime()的方法

    Java 中Date类getTime()的方法 1.getTime() /**Returns the number of milliseconds since January 1, 1970, 00: ...

  6. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  7. java里的进制转换函数_基于Java中进制的转换函数详解

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  8. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  9. java读写json格式的文件方法详解.txt,并批量存储进redis

    捐躯赴国难,视死忽如归.恸哭六军俱缟素,冲冠一怒为红颜.君子坦荡荡,小人长戚戚.风日晴和人意好,夕阳箫鼓几船归.民为贵,社稷次之,君为轻.Java 读写json格式的文件方法详解 文章录入:7747. ...

最新文章

  1. Golang gin框架:GET请求示例
  2. 优秀的Java开发人员必备的6个技能
  3. 容器内存释放问题(STL新手笔记)
  4. TintTo和TintBy
  5. 如何在SAP Spartacus里捕捉感兴趣的事件
  6. html jade文件,Jade模板
  7. 流量卡物联网卡管理平台源码|PHP管理系统源码
  8. bat ping 返回值_清清楚楚玩游戏!10.10版本,赛娜被动层数可以ping给队友看了
  9. 微信商户转账到银行卡
  10. 市场上主要的PB系统提供商简介
  11. 世界各国国家货币代码大全[收藏]
  12. 计算机网络世界(知识扫盲一)
  13. 泛型---上界通配符和下界通配符
  14. 使用cropper插件实现图片的裁剪和预览
  15. MSCOCO数据集转VOC数据集训练目标检测模型
  16. 获取高匿代理ip的步骤思路(推荐使用--刚找到的方法判断是否高匿)
  17. 一个点序AS2258坏盘在懵逼中修复成功?(台电SD128GS550)
  18. 如何查看斐讯路由器的版本
  19. SQLPro Studio for Mac(可视化数据库管理工具)
  20. Oracle----Orcacle简介

热门文章

  1. RecyclerView.ItemAnimator实现动画效果
  2. python cv2模块安装,python cv2模块怎么安装
  3. 活动Activity
  4. 民间最大社区,倒闭了。
  5. 三秒一页,快速录入书籍中的文字,掌握这个黑科技不加薪才怪
  6. 学习编程语言时,为何有很多人不建议从C语言开始学起[图]
  7. 基于M2P-HCC原研模型的肝癌早筛产品HCCscreen
  8. DNA 13. SCI 文章肿瘤突变负荷计算方法(TMB)
  9. 设置背景透明文字内容不透明方法
  10. 网络端口采用了1000M速率时候出现网络通信丢包+IDC机房托管服务器之间通信不畅...