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. linux安装python3+selenium

    安装笔记 当前安装使用centos7 安装python3 1.下载 [admin@ ~] wget https://www.python.org/ftp/python/3.6.0/Python-3.6 ...

  2. IDEA部署项目和多余的项目删掉的演示

  3. 目标检测算法之YOLOv3

    参考地址:https://blog.csdn.net/leviopku/article/details/82660381 YOLO v3结构图 DBL:卷积+BN+leaky relu,是v3的最小组 ...

  4. 安装和配置bazel

    2018-12-26 21:56:23 编译和移植tensorflow的C/C++源码时,用到bazel这一构建工具.本篇blog记录遇到的安装.配置问题. 吐槽 构建工具,从make/ant/cma ...

  5. Linux系统编程目录

    进程环境 进程控制 1. fork.vfork.clone 2. 回收子进程 3. exec函数族 进程关系 1. 进程组 2. 会话 信号 1. 函数函数sigaction.signal 2.僵尸进 ...

  6. 挂在光盘出现写保护mount: block device /dev/sr0 is write-protected, mounting read-only

    https://blog.csdn.net/yueludanfeng/article/details/60339688

  7. webpack学习笔记--提取公共代码

    为什么需要提取公共代码 大型网站通常会由多个页面组成,每个页面都是一个独立的单页应用. 但由于所有页面都采用同样的技术栈,以及使用同一套样式代码,这导致这些页面之间有很多相同的代码. 如果每个页面的代 ...

  8. yum安装mongodb

    1.创建mongodb.repo文件 在/etc/yum.repos.d/目录下创建文件mongodb.repo,它包含MongoDB仓库的配置信息,内容如下: 复制代码代码如下: [mongodb] ...

  9. 使用Eclipse绑定Tomcat并发布应用

    l 步骤1:获得服务器运行环境配置,Window/Preferences/Server/Runtime Environmen l步骤2:添加服务器 l步骤3:选择服务器在硬盘的地址,然后所有的都是确定 ...

  10. Vue用v-for给循环标签自身属性添加属性值

    转自http://www.cnblogs.com/lliuhh/p/7691604.html <RadioGroup v-model="animal"> <Rad ...