天天看点

解决BigDecimal工作中遇到的坑工作中遇到的问题

BigDecimal精度遇到的坑

  • 工作中遇到的问题
    • BigDecimal失精的原因
    • 解决办法

工作中遇到的问题

作为一个新手,记得在第一次使用同事推荐的BigDecimal这个包装类的时候,遇到了很多问题,开始在使用BigDecimal的时候,用的是转double然后做运算,结果最后失精了,这是小编一开始用的时候遇到的一个很愚蠢的问题 .希望大家不要嘲笑,后来慢慢的测试和查看资料发现,BigDecimal的运算方法是不会失精的 ,大家工作的时候可以使用BigDecimal进行运算

BigDecimal失精的原因

  1. BigDecimal只有在初始化的时候使用double初始化,可能会导致失精,
  2. 转成double进行计算
  3. 转成double显示有时候也会出现失精,原因是double不适合表示小时

解决办法

大家使用的时候可以使用BigDecimal.valueOf()方法,或者使用new BigDecimal(“0.1”);

public static BigDecimal valueOf(double val) {
		//查看了BigDecimal源码才知道,这货为了精度不丢失,使用的是String初始化了一个新的对象返回的.
        // Reminder: a zero double returns '0.0', so we cannot fastpath
        // to use the constant ZERO.  This might be important enough to
        // justify a factory approach, a cache, or a few private
        // constants, later.
        return new BigDecimal(Double.toString(val));
    }
           

所以小编推荐大家在使用的时候可以使用new BigDecimal(“0.1”);初始化,或者使用BigDecimal.valueOf(0.1);都可以.

不能使用double和float. 因为double和float不是表示小数的.

官方解释:float和double类型主要是为了科学计算和工程计算而设计,他们执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近和计算而精心设计的,然而,他们并没有提供完全精确的结果,所以不应该被用于精确的结果的场合

老版本项目迭代下来的,只能在做显示的时候转BigDecimal,在计算的时候使用BigDecimal的方法进行计算.

注:小编也是总结自己在学习BigDecimal的时候遇到问题,和总计,可能会有很多不足的地方希望有大神能指出,感激不尽.小编会继续深入了解BigDecimal 和精度的学习 .后期可能会继续更新这方面的内容.