java BigDecimal使用

一、BigDecimal的加减乘除:

package com.cy.test.math;

import java.math.BigDecimal;

public class TestBigDecimal {
    public static void main(String[] args) {
        //加法
        double d1 = 1.234;
        double d2 = 2.341;
        System.out.println(d1 + d2);    //3.575

        System.out.println(d1 * d2);    //2.8887940000000003精度出问题了
        System.out.println(d1 / d2);    //0.5271251601879539 这个是对的

        //使用BigDecimal,加法
        BigDecimal b1 = new BigDecimal(Double.toString(d1));
        BigDecimal b2 = new BigDecimal(Double.toString(d2));
        System.out.println(b1.add(b2).doubleValue());       //3.575

        //减法
        System.out.println(b1.subtract(b2).doubleValue());  //-1.107

        //乘法
        System.out.println(b1.multiply(b2).doubleValue());  //2.888794

        //除法  保留小数点后两位,四舍五入
        System.out.println(b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP)); //0.53
    }
}

二、BigDecimal转String的时候出现的精度问题:

有些两位类型的小数如double类型的,直接转化为String时,调用的是BigDecimal的toString方法,会出现精度问题。解决办法:

package com.cy.test.math;

import java.math.BigDecimal;

public class TestBigDecimal3 {

    public static void main(String[] args) {
        BigDecimal b1 = new BigDecimal(1.23);
        BigDecimal b2 = new BigDecimal(1.24);
        BigDecimal b3 = new BigDecimal(1.25);

        System.out.println(b1);
        System.out.println(b2);
        System.out.println(b3);

        BigDecimal plus = b1.add(b2).add(b3);
        //直接打印会精度失真
        System.out.println(plus);
        System.out.println(String.valueOf(plus.floatValue()));

        //设置小数位数,第一个变量是小数位数,第二个变量是取舍方法(四舍五入)
        BigDecimal plus2 = b1.add(b2).add(b3).setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(plus2);
    }
}

打印结果:

1.229999999999999982236431605997495353221893310546875
1.2399999999999999911182158029987476766109466552734375
1.25
3.7199999999999999733546474089962430298328399658203125
3.72
3.72
原文地址:https://www.cnblogs.com/tenWood/p/11325247.html