BigDecimal口味成长快乐

为什么用BigDecimal
在日常练习中,float和double基本上都能满足我们对于小数的需求,但是在实际业务诉求中,为了避免精度丢失(少10W个一分钱课不得了)使用BigDecimal。包括浮点数的运算,也很容易造成精度丢失。
构造BigDecimal对象
BigDecimal对象的构造有3种方式

new BigDecimal(Double d);
new BigDecimal(Integer i);
new BigDecimal(String s);
public static void main(String[] args)
    {
        BigDecimal bigDecimal = new BigDecimal(2);
        BigDecimal bDouble = new BigDecimal(2.3);
        BigDecimal bString = new BigDecimal("2.3");
        System.out.println("bigDecimal=" + bigDecimal);
        System.out.println("bDouble=" + bDouble);
        System.out.println("bString=" + bString);
    }

上面是我从网上的技术博客摘下来的,这个示例是为了体现,在构造的时候最好不要使用double作为参数
JDK的描述:参数类型为double的构造方法的结果有一定的不可预知性。在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

使用String类型参数构造
因为String类型是可预知的"0.1"即0.1,而数据源是double的时候也建议使用Double.toString(value)转换成String后再进行构造

加减乘除

public BigDecimal add(BigDecimal value);                        //加法

public BigDecimal subtract(BigDecimal value);                   //减法 

public BigDecimal multiply(BigDecimal value);                   //乘法

public BigDecimal divide(BigDecimal value);                     //除法

除法可能不会整除,divide也提供3参方法,第二参为保留小数,第三参为保留模式

我遇到的情况
在开发过程中,碰到了一个需要将所有的钱相加的一个需求,即遍历List取money相加。
起初我认为只是简单的用BigDecimal相加,换了方法名而已而且看到这个方法
a.add(b);
自然理解为了是在a的基础上加上b并返回给a
实际上他并不会返回给a所以需要使用

a=a.add(b);

否则就一直是a构造时的那个值,填一个小坑

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值