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

猜你喜欢

转载自blog.csdn.net/bb23417274/article/details/84680563