很多人都知道在Java高精度计算时需要使用BigDecimal,实际上,很多对数值精度敏感的领域,比如结算、财务,也确实都是使用BigDecimal这种高精度计算工具来实现的,在二进制计算机的世界了,在有限的存储介质上无法准确保存0.1,就像十进制无法准确保存1/3类似,如果研究的更理论一些,可以看一下IEEE754二进制浮点数算术标准(https://baike.sogou.com/v514046.htm?fromTitle=IEEE+754),下面我们来看一个BigDecimal支持高精度计算的示例。
示例中BigDecimal的除法将1/3的结果小数点后保留了10000位,而这是float和double无法做到的,在使用BigDecimal的时候推荐使用字符串表达式作为入参创建示例,否则会出现上面示例的情况,超过一定位数后有误差。接下来我们简单分析下java.math.BigDecimal这个类。
1.数据结构,BigDecimal内部主要使用intVal、scale、intCompact来记录数值,类图如下: