Java BigDecimal 一些注意点

来源:互联网 发布:淘宝网地板棉拖鞋 编辑:程序博客网 时间:2024/06/05 08:55

为什么要有BigDecimal ,他是干什么的

float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候就要使用BigDecimal啦。


什么是BigDecimal

BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale)。


用法

可以处理任意长度的浮点数运算。

BigDecimal add(BigDecimal val) //BigDecimal 加法

BigDecimal subtract (BigDecimal val) //BigDecimal 减法

BigDecimal multiply (BigDecimal val) //BigDecimal 乘法

BigDecimal divide (BigDecimal val,RoundingMode mode) 除法


注意 *使用时要查看一下源码,有好多实现细节需要注意(有坑啊)

参数类型为double的构造方法的结果有一定的不可预知性

尽量使用参数类型为String的构造函数。

BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常, 需要设置精确度;就是给divide设置精确的小数点 。

参数类型为double的构造方法的结果有一定的不可预知性,因为不能double表示为任何有限长度的二进制小数,遇到这种情况先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用valueOf(double)方法。

使用compareTo方法来进行比较。返回的结果是int类型,-1表示小于,0是等于,1是大于。因为BigDecimal比较时,不仅比较值,而且还比较精度

0 0
原创粉丝点击