BigDecimal使用及精度问题

● 前言
之所以写下这个只是因为业务上的一些精度bug,服务端的位数与客户端不统一(java与c++),造成服务端发送的Dobule数值客户端无法接收,在某些语言上的数值显示异常(如阿语)

        /**
         * 临时备注::myslq的sum函数的返回值的类型不确定(Integer,Dobule),最好强转成BigDecimal(cast函数),服务端可以直接用long接收
         */

        //强烈建议使用构造参数String的构造器,否则引起精度问题
        BigDecimal a = new BigDecimal("2.27");
        System.out.println("one : " + a);

        BigDecimal b = new BigDecimal(1.22);
        //损失精度
        System.out.println("two : " + b);
        b = new BigDecimal("1.22");

        //加操作
        //如果是值 a.add(b) 操作无返回值接收就出问题了,必须有一个对象去接收返回的结果,a本身还是原来的值
        //如果BigDecimal是传参的话,那么他是值传递(参考基本类型,拷贝一份副本,改变的只是副本的值,实际值不会改变)
        a = a.add(b);
        System.out.println("three : " + a);
        //减操作
        a = a.subtract(new BigDecimal("1.5"));
        System.out.println("four : " + a);
        //乘操作
        a = a.multiply(new BigDecimal("2.0"));
        System.out.println("five :" + a);
        //除操作
        a = a.divide(new BigDecimal("3"),1);
        System.out.println("six :" + a);
        //乘方:pow(int)  取绝对值:abs()  取反:negate()

输出结果

one : 2.27
two : 1.2199999999999999733546474089962430298328399658203125
three : 3.49
four : 1.99
five :3.980
six :1.326
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值