使用jdk1.8为例
- BigDecimal 介绍
对于代码计算方面,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦,这个对象是Java里精确计算的类
比如银行上涉及到大量金额负责情况计算都会用到该类做数据类型,很多人还喜欢用double去计算小数点,其实double会四舍五入丢失精准度。
BigDecimal 有效数据:小数点前10位,小数点后15位
BigDecimal 一般采用jdk内的java.math.BigDecimal类import就可以实现
BigDecimal 的转换关系
结果 :任意数值类型可以转换
不建议使用double转换:
参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
建议使用String转换:
String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。
BigDecimal加减乘除运算
加:add(BigDecima)
减:subtract(BigDecimal)
乘:multiply(BigDecimal)
除:divide(BigDecimal)
乘方:pow(int)
取绝对值:abs()
取反:negate()
对比:compareTo(BigDecimal)
设置小数点精确度:setScale(int)
设置保留小数点精确度并添加保留方式(直接加1或者四舍五入):setScale(int, int)
注意的是除法运算divide.
其中divide方法有可以传三个参数
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
第一参数表示除数, 第二个参数表示小数点后保留位数,
第三个参数表示舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,有下面这几种
减乘除其实最终都返回的是一个新的BigDecimal对象,因为BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象
比较大小
可以通过BigDecimal的compareTo()方法来进行比较。
返回的结果是int类型,-1表示小于,0是等于,1是大于。
BigDecimal比较大小equals和compareTo方法
对于BigDecimal的大小比较,用equals方法的话会不仅会比较值的大小,还会比较两个对象的精确度
还待深研,如急需用到建议用compareTo就可以了,不行在换equals
去除尾数
有时候输入的是整数,但是保存的格式是bigdecimal是两位小数,会自动加上.00,有时候我们不需要这个没有意义的小数,去除他的方法是:
stripTrailingZeros方法会将.00去掉还是bigdecimal格式,如果想要string格式的话:toPlainString()
建议:当您的项目为金融类,建议您写个util类,因为在计算方面,会运算到大量的复合运算,调用起来太长太臭,提前有了工具类优化一个合适您项目的计算模式提高可读性
该文个人理解大概就这么多,后续更深入理解bigdecimal其他用法会给该文补充。