Java的商业计算,不能用float和double,因为他们无法进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾。

BigDecimal类位于java.maths类包下。及在商业或银行开发总,涉及到金钱或者倍率的情况下,都用bigdecimal格式。
BigDecimal常用的方法

  • public BigDecimal add(BigDecimal augend):加
  • public BigDecimal subtract(BigDecimal subtrahend):减
  • public BigDecimal multiply(BigDecimal multiplicand):乘
  • public BigDecimal divide(BigDecimal divisor):除
  • public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):除数,几位小数,如何舍取。

对于BigDecimals您可以同时指定舍入模式和精度,但有一个更方便的方法 - 您可以使用MathContext代替,其中包含精度和舍入的信息。
使用MathContext进行加减运算可以直接操作(会丢失精度),但对于乘除最好规定一个DECIMAL*上下文,它们是必需的,因为当运算结果有一个无限长的十进制扩展,这些操作需要指定精度。否则会报ArithmeticException错误。

下面看看Demo

public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(13.14);
BigDecimal b2 = new BigDecimal(5.20);
MathContext mc = new MathContext(4); BigDecimal b3 = b1.add(b2,mc);
BigDecimal b4 = b1.subtract(b2);
BigDecimal b5 = b1.divide(b2);//报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
BigDecimal b5 = b1.divide(b2,mc);
BigDecimal b6 = b1.multiply(b2);//报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
BigDecimal b6 = b1.multiply(b2,mc);
System.out.println(b3);
System.out.println(b4);
System.out.println(b5);
System.out.println(b6); }
}

另外,在做除法操作时,需要对被除数做非0判断,不然会报java.lang.ArithmeticException: Division by zero。

public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(13.14);
MathContext mc = new MathContext(4);
BigDecimal b2 = BigDecimal.ZERO;
if (b2.intValue() != 0) {
BigDecimal b8 = b1.divide(b2, mc);
System.out.println(b8);
}else {
System.out.println("Division not zero");
}
}
}

对于double, 请不要将double转为BigDecimal,先将double转为String,再将String转为BigDecimal。
如果你的算术需要将一个字符串作为输入,将其直接转换为BigDecimal。好处是你会避免任何的舍入误差。

BigDecimal使用中的一些注意事项的更多相关文章

  1. BigDecimal使用中的坑

    1.BigeDecimal调用divide时一定要记得规定小数位数的保留情况,不然除不尽的时候报错. 2.使用该种BigeDecimal时,加减乘除都要使用它内部封装好的方法,不然容易报错.

  2. java中null是什么,以及使用中要注意的事项

    1.null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,例如: Integer i=null; Float f=null; String ...

  3. robotframework使用中的一些注意事项

    1.关于\的转义.使用\\ 2.关于字符串的合并 3.切换到iframe,切出iframe 4.对对象右键点击 5.对对象实现按键操作,在处理一些下拉对象时需要用到. 6.当元素定位十分困难的时候,需 ...

  4. Ubuntu安装使用中的一些注意事项

    在win7上安装VMware workstations10.0 ,在VMware workstations10.0上安装Ubuntu14.04 64位时,关于网络的连接注意: win7 网络连接里上的 ...

  5. Linq使用中的ToList注意事项

    在使用Linq时,如果查询逻辑太复杂,可以拆分为多个Linq查询,下一个Linq在上一个Linq查询的结果上继续操作,这样逻辑清晰,又不会出错.但在使用ToList的时候需要注意,最常见碰到的错误是: ...

  6. PowerShell 操作 Azure SQL Active Geo-Replication 实战

    <Azure SQL Database Active Geo-Replication简介>一文中,我们比较全面的介绍了 Azure SQL Database Active Geo-Repl ...

  7. Vuejs技术栈从CLI到打包上线实战全解析

    前言 本文是自己vue项目实践中的一些总结,针对Vue2及相关技术栈,实践中版本为2.3.3. 开发前须知 vue-cli 在开发前,我们要至少通读一遍vue官方文档和API(看官方文档是最重要的,胜 ...

  8. XtraBackup应用说明(支持TokuDB)

    背景: 关于物理备份工具xtrabackup的一些说明可以先看之前写过的文章说明:XtraBackup 安装使用和xtrabackup 使用说明(续),本篇文章将介绍xtrabackup在使用中的注意 ...

  9. tvs二极管应用电路

    瞬态电压抑制器(TVS)具有响应时间快.瞬态功率大.漏电流低.击穿电压偏差小.箝位电压较易控制.无损坏极限.体积小等优点.目前已广泛应用于计算机系统.通讯设备.交/直流电源.汽车.家用电器.仪器仪表等 ...

随机推荐

  1. CF1000G

    蜜汁树形dp... 首先分析一下:他要求一条边至多只能经过两次,那么很容易会发现:从x到y这一条路径上的所有边都只会被经过一次.(如果过去再回来那么还要过去,这样就三次了,显然不合法) 那么其他能产生 ...

  2. node.js 的热更新

    1.安装 npm i supervisor -gd 2.运行 supervisor server.js //server.js 是你自己的服务的js文件

  3. 如何让微信里的html应用弹出“点击右上角分享到朋友圈”的图片

    一个分享按钮,一个隐藏的图片(这个图片绝对定位在右上角)然后就是点击显示,点击隐藏了... <a href="javascript:;" onclick="docu ...

  4. WCF 寄宿Windows以及控制台启动

    一:添加windows服务 二:修改XXXInstaller1的StartType=Automatic,修改ProcessInstaller1的Account=LocalSystem 三:在progr ...

  5. Notepad++文件自动更新

  6. AndroidStudio在线搜索最新版本的依赖库

    操作步骤 打开File–>Project Structure 选中当前项目,点击Denpendencies标签 点击+,选Library dependency 打开界面如下: 输入想要的依赖库部 ...

  7. C# 之 反射性能优化1

    反射是一种很重要的技术,然而它与直接调用相比性能要慢很多,因此如何优化反射性能也就成为一个不得不面对的问题. 目前最常见的优化反射性能的方法就是采用委托:用委托的方式调用需要反射调用的方法(或者属性. ...

  8. Windows 之 IP地址

    IP地址是指互联网协议地址(Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络 ...

  9. Python学习(二十一) —— 前端之JavaScript

    转载自http://www.cnblogs.com/liwenzhou/p/8004649.html 一.JavaScript概述 1.JavaScript的历史 1992年Nombas开发出C-mi ...

  10. Codeforces 886E Maximum Element 组合数学 + dp

    我们定义dp[ i ]表示长度为 i 的序列, 最后没有一个==k的时候返回的方案数, 也就是最后强制返回 i 的方案数. 我们能得到dp方程   dp[ i ] = sum(dp[ i - j - ...