BigDecimal 小数精度问题

BigDecimal,不可变的、任意精度的有符号十进制数。
    BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度(scale) 组成。
    如果为零或正数,则标度是小数点后的位数。
    如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。
    因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。我们知道BigDecimal有三个主要的构造函数
    
    public BigDecimal(double val) 将double表示形式转换为BigDecimal
    public BigDecimal(int val) 将int表示形式转换为BigDecimal
    public BigDecimal(String val) 将字符串表示形式转换为BigDecimal
    
    总结:
      1:尽量避免传递double类型,有可能的话,尽量使用int和String类型。
      2:做乘除计算时,一定要设置精度和保留小数点位数。

      3:BigDecimal计算时,单独放到try catch内。


如果需要精确计算,非要用String来够造BigDecimal不可!


在Java中,float声明的变量是单精度浮点数,double声明的变量是双精度浮点数,顾名思义就是double型的实体占用内存空间是float的两倍。float是4个字节而double是8个字节。float和double类型的数据,无法精确表示计算结果,这是由于float和double是不精确的计算


我们最终需要使用String来创建对象,这样得到的结果才是最精确的。另外,如果是double数,我们还可以使用:BigDecimal.valueOf(double val)

public static BigDecimal valueOf ( double val ) {     return new BigDecimal ( Double . toString ( val ) ) ; }
但是BigDecimal bf = BigDecimal.valueOf(0.03f);//会丢失精度 ,丢失精度了因为f隐式转换成了double
BigDecimal的加减乘除其实最终都返回的是一个新的BigDecimal对象,因为BigDecimal是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以a.add(b);虽然做了加法操作,但是a并没有保存加操作后的值,正确的用法应该是a=a.add(b)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值