Java中BigDecimal类的使用方法详解,常用最全系列!
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}
注意事项:
- BigDecimal的加减乘除操作,其实最终返回的都是一个新的BigDecimal对象,因为BigDecimal都是不可变的的(BigInteger同理);
- 如果用BigDecimal做除法,一定要在divide()方法中传递第二个参数scale,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出ArithmeticException异常。
小结:
- 凡是涉及到精确计算的地方,要使用BigDecimal;
- 建议每个项目中,都要提前准备一个BigDecimal计算的utils类;
- 尽量使用参数类型为String的构造函数,避免计算误差(即使是Double数据,其实也是先被toString处理了);
- BigDecimal是不可变的,在进行每一步运算时,都会产生一个新的对象。
更多精彩,请关注我的"今日头条号":Java云笔记
随时随地,让你拥有更新,更便捷的掌上云服务
Java中BigDecimal类的使用方法详解,常用最全系列!相关推荐
- Java中BigInteger类的使用方法详解,常用最全系列!
原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 在 Java 中,有许多数字处理的类,比如 Integer类,但是Integer类有一定的局限性. 我们都知道 Integer 是 Int ...
- Java中BigDecimal类介绍及用法
Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...
- Python的Django框架中forms表单类的使用方法详解2
用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...
- Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释
Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...
- Java 中Date类getTime()的方法
Java 中Date类getTime()的方法 1.getTime() /**Returns the number of milliseconds since January 1, 1970, 00: ...
- java throw与throws_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- java里的进制转换函数_基于Java中进制的转换函数详解
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- throws java_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- java读写json格式的文件方法详解.txt,并批量存储进redis
捐躯赴国难,视死忽如归.恸哭六军俱缟素,冲冠一怒为红颜.君子坦荡荡,小人长戚戚.风日晴和人意好,夕阳箫鼓几船归.民为贵,社稷次之,君为轻.Java 读写json格式的文件方法详解 文章录入:7747. ...
最新文章
- Golang gin框架:GET请求示例
- 优秀的Java开发人员必备的6个技能
- 容器内存释放问题(STL新手笔记)
- TintTo和TintBy
- 如何在SAP Spartacus里捕捉感兴趣的事件
- html jade文件,Jade模板
- 流量卡物联网卡管理平台源码|PHP管理系统源码
- bat ping 返回值_清清楚楚玩游戏!10.10版本,赛娜被动层数可以ping给队友看了
- 微信商户转账到银行卡
- 市场上主要的PB系统提供商简介
- 世界各国国家货币代码大全[收藏]
- 计算机网络世界(知识扫盲一)
- 泛型---上界通配符和下界通配符
- 使用cropper插件实现图片的裁剪和预览
- MSCOCO数据集转VOC数据集训练目标检测模型
- 获取高匿代理ip的步骤思路(推荐使用--刚找到的方法判断是否高匿)
- 一个点序AS2258坏盘在懵逼中修复成功?(台电SD128GS550)
- 如何查看斐讯路由器的版本
- SQLPro Studio for Mac(可视化数据库管理工具)
- Oracle----Orcacle简介
热门文章
- RecyclerView.ItemAnimator实现动画效果
- python cv2模块安装,python cv2模块怎么安装
- 活动Activity
- 民间最大社区,倒闭了。
- 三秒一页,快速录入书籍中的文字,掌握这个黑科技不加薪才怪
- 学习编程语言时,为何有很多人不建议从C语言开始学起[图]
- 基于M2P-HCC原研模型的肝癌早筛产品HCCscreen
- DNA 13. SCI 文章肿瘤突变负荷计算方法(TMB)
- 设置背景透明文字内容不透明方法
- 网络端口采用了1000M速率时候出现网络通信丢包+IDC机房托管服务器之间通信不畅...