Java基础教程——BigDecimal类

BigDecimal类

float、double类型的数字在计算的时候,容易发生精度丢失。

使用java.math.BigDecimal类可以解决此类问题。

前面讲过Math类,现在的BigDecimal类所在的包是math包。
注意Math类不在math包中,而是在lang包中。

形如:BigDecimal f3 = new BigDecimal(0.05);
创建BigDecimal类型也有进度偏差,一般——

使用字符串形式构建,或者使用valueOf()方法得到!
使用字符串形式构建,或者使用valueOf()方法得到!!
使用字符串形式构建,或者使用valueOf()方法得到!!!

import java.math.BigDecimal;
public class TestBigDecimal {
	public static void main(String[] args) {
		System.out.println("---字符串,直接构造---");
		BigDecimal f1 = new BigDecimal("0.05");
		System.out.println("---浮点型,valueOf(double val)---");
		BigDecimal f2 = BigDecimal.valueOf(0.01);
		System.out.println("0.05 + 0.01 = " + f1.add(f2));
		System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
		System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
		System.out.println("0.05 / 0.01 = " + f1.divide(f2));
		System.out.println("---如果浮点型直接构造,会有误差---");
		BigDecimal f3 = new BigDecimal(0.05);
		System.out.println(f3);
		System.out.println("0.05 + 0.01 = " + f3.add(f2));
	}
}

应用:

如果要对浮点型数据进行基本运算,需要先包装成BigDecimal类,在调用相应的方法,最后再转成基本类型的变量,过程比较繁琐。可以自定义一个用于BigDecimal类型运算的工具类。

package ahjava.p04util;
import java.math.*;
/**
 * 
 * <p>
 * Description: 定义一个便于BigDecimal操作的工具类
 * </p>
 * 
 * @author 虎老狮
 * @version 1.0
 */
public class BigDecimalUtil {
	// 除法运算精度
	private static final int DIV_SCALE = 10;
	// 构造器私有,让这个类不能实例化
	private TestBigDecimalUtil() {
	}
	// 提供精确的加法运算。
	public static double add(double v1, double v2) {
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.add(b2).doubleValue();
	}
	// 提供精确的减法运算。
	public static double sub(double v1, double v2) {
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.subtract(b2).doubleValue();
	}
	// 提供精确的乘法运算。
	public static double mul(double v1, double v2) {
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.multiply(b2).doubleValue();
	}
	// 提供(相对)精确的除法运算,当发生除不尽的情况时.
	// 精确到小数点以后10位的数字四舍五入。
	public static double div(double v1, double v2) {
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		// ROUND_HALF_UP: ___遇到.5时往上近似,例: 1.5 ->2
		// ROUND_HALF_DOWN : 遇到.5时往下近似,例: 1.5 ->1
		return b1.divide(b2, DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	public static void main(String[] args) {
		System.out.println("0.05 + 0.01 = " + TestBigDecimalUtil.add(0.05, 0.01));
		System.out.println("1.0 - 0.42 = " + TestBigDecimalUtil.sub(1.0, 0.42));
		System.out.println("4.015 * 100 = " + TestBigDecimalUtil.mul(4.015, 100));
		System.out.println("123.3 / 100 = " + TestBigDecimalUtil.div(123.3, 100));
	}
}

四舍五入

BigDecimal类可以进行精确的四舍五入。
setScale(int newScale, int roundingMode)方法可以设置精确到小数点后多少位。
roundingMode设为BigDecimal.ROUND_HALF_UP表示“四舍五入”。

当然还有其他舍入方案,但是不常用,就急这个就够了

import java.math.BigDecimal;
public class 四舍五入 {
	public static void main(String[] args) {
		BigDecimal d = new BigDecimal("1.12345");
		System.out.println(d);
		// 精确到小数点后4位
		BigDecimal setScale1 = d.setScale(4, BigDecimal.ROUND_HALF_UP);
		System.out.println(setScale1);
	}
}

运行结果:

1.12345
1.1235
posted @ 2019-07-13 01:55  虎老狮  阅读(489)  评论(0编辑  收藏  举报