• 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
    
  • 相关阅读:
    17. 电话号码的字母组合
    12. 整数转罗马数字
    01-正则表达式基础
    前端SEO技巧
    node.js
    Vue.生命周期
    Vue小案例--过滤器的基本操作
    vue简单的计算器
    VSCode 自动刷新
    Vue.js学习
  • 原文地址:https://www.cnblogs.com/tigerlion/p/11179200.html
Copyright © 2020-2023  润新知