Java中对浮点型数据的精确处理

Java中对浮点型数据的精确处理

1.普通的double,float型数据处理会使精度丢失

2.使用BigDecimal 处理会让精度保留

//对浮点类型的准确处理(常用于银行等精确计算的数据)

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class BigDecimalTest {
    public static void main(String[] args) {
        BigDecimal b1 = new BigDecimal("0.05");//构造器是字符串String类型(一定要这样做)
        BigDecimal b2 = BigDecimal.valueOf(0.01); //创建BigDecimal对象,静态方法
        BigDecimal b3 = new BigDecimal(0.05);// 一般不这样做,这样做的数不准确,传入的是一个近似值

        System.out.println("使用String类型作为参数");
        System.out.println("0.05+0.01=" + b1.add(b2));
        System.out.println("使用double类型作为构造器的参数");
        System.out.println("0.05+0.01=" + b3.add(b2));

        //封装一些方法
        Scanner in = new Scanner(System.in);
        System.out.println("请输入两个浮点数:");
        double a = in.nextDouble();
        double b = in.nextDouble();
        System.out.println("a+b=" + add(a, b));
        System.out.println("a/b=" + div(a, b));

    }

    //加法运算
    public static double add(double d1, double d2) {
        BigDecimal b1 = BigDecimal.valueOf(d1);
        BigDecimal b2 = BigDecimal.valueOf(d2);
        return b1.add(b2).doubleValue();     //最终要转换成doubleL类型

    }

    //除法运算
    public static double div(double d1, double d2) {
        BigDecimal b1 = BigDecimal.valueOf(d1);
        BigDecimal b2 = BigDecimal.valueOf(d2);
        return b1.divide(b2, 20, RoundingMode.HALF_UP).doubleValue();   //相对精确,当除不尽的时候可以保留小数点后20位,然后四舍五入
    }
}

备注:创建BigDecimal 对象时,不会直接使用double型浮点数作为构造器的参数来调用构造器,否则同样会让精度丢失。

猜你喜欢

转载自blog.csdn.net/qq_41033299/article/details/88963941