Java中BigDecimal解决精度丢失问题

1.我们先看一个例子

可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题。那么我们如果在进行商品价格计算的时候,就会出现问题。很有可能造成我们手中有0.06元,却无法购买一个0.05元和一个0.01元的商品。因为如上所示,他们两个的总和为0.060000000000000005。这无疑是一个很严重的问题,尤其是当电商网站的并发量上去的时候,出现的问题将是巨大的。可能会导致无法下单,或者对账出现问题。所以接下来我们就可以使用Java中的BigDecimal类来解决这类问题。

2.BigDecimal中的一些方法

构造器                   描述                      
  BigDecimal(int)       创建一个具有参数所指定整数值的对象。      
  BigDecimal(double)    创建一个具有参数所指定双精度值的对象。     
  BigDecimal(long)      创建一个具有参数所指定长整数值的对象。     
  BigDecimal(String)    创建一个具有参数所指定以字符串表示的数值的对象。
方法                    描述                         
  add(BigDecimal)       BigDecimal对象中的值相加,然后返回这个对象。
  subtract(BigDecimal)  BigDecimal对象中的值相减,然后返回这个对象。
  multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。
  divide(BigDecimal)    BigDecimal对象中的值相除,然后返回这个对象。
  toString()            将BigDecimal对象的数值转换成字符串。    
  doubleValue()         将BigDecimal对象中的值以双精度数返回。   
  floatValue()          将BigDecimal对象中的值以单精度数返回。   
  longValue()           将BigDecimal对象中的值以长整数返回。    
  intValue()            将BigDecimal对象中的值以整数返回。
3.值得注意的是如果要想无精度丢失的情况下计算结果,那么需要把double,float类型的参数转化为String类型的。并且使用BigDecimal(String)这个构造方法进行构造。 去获取结果。不然还是没有效果。

(1)

 (2)

4.在一般开发过程中,我们数据库中存储的数据都是float和double类型的。在进行拿来拿去运算的时候还需要不断的转化,这样十分的不方便。这里我写了一个工具类,以后可以直接使用。

public class BigDecimalUtil {
 
    private BigDecimalUtil() {
 
    }
 
    public static BigDecimal add(double v1, double v2) {
        // v1 + v2
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2);
    }
 
    public static BigDecimal sub(double v1, double v2) {
        //v1-v2 
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2);
    }
 
    public static BigDecimal mul(double v1, double v2) {
        //v1*v2
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2);
    }
 
    public static BigDecimal div(double v1, double v2) {
        //v1/v2
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        // 2 = 保留小数点后两位   ROUND_HALF_UP = 四舍五入
        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);// 应对除不尽的情况
    }
}
 
————————————————
版权声明:本文为CSDN博主「一个可爱的姑娘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yin_xing_ye/article/details/94596247

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值