Java中BigDecimal类简介及用法说明(全网最全讲解)
下文可以好不夸张的说:"是整个互联网中"最全的BigDecimal类的教程
BigDecimal是什么呢?
我们都知道 在Java中对大数值的处理,可以采用java.math.BinInteger类和java.math.BigDecimal类,进行处理 然而BigInteger只能对整型进行处理,而BigDecimal可对整数和小数进行处理
可以说:"BigDecimal包含BigInteger"的功能 所以我们熟知BigDecimal类的功能,则可以应付日常工作中的点点滴滴 另外 BigDecimal相对于float和Double的计算,其精度更高, 所以数学计算,金额计算,都必须使用BigDecimal类进行相关操作 下文笔者将详细讲述BigDecimal类的构造函数及其中常用的方法,如下所示
创建BigDecimal对象常用方法说明
BigDecimal BigDecimal(double d); //笔者推荐使用 BigDecimal BigDecimal(String s); static BigDecimal valueOf(double d);例:
BigDecimal对象应用示例
public static void main(String[] args) {
double d1 = 0.812323;
double d2 = 77823.0;
//禁止使用以下方法
System.out.println("new BigDecimal("+d1+")=" + new BigDecimal(d1));
System.out.println("new BigDecimal("+d2+")=" + new BigDecimal(d2));
System.out.println("======================");
System.out.println("new BigDecimal(String.valueOf("+d1+"))=" + new BigDecimal(String.valueOf(d1)));
System.out.println("new BigDecimal(String.valueOf("+d2+"))=" + new BigDecimal(String.valueOf(d2)));
System.out.println("======================");
System.out.println("new BigDecimal(String.valueOf("+d1+"))=" + new BigDecimal(Double.toString(d1)));
System.out.println("new BigDecimal(String.valueOf("+d2+"))=" + new BigDecimal(Double.toString(d2)));
System.out.println("======================");
System.out.println("BigDecimal.valueOf("+d1+")=" + BigDecimal.valueOf(d1));
System.out.println("BigDecimal.valueOf("+d2+")=" + BigDecimal.valueOf(d2));
System.out.println("===================");
BigDecimal b1 = BigDecimal.valueOf(8);
BigDecimal b2 = BigDecimal.valueOf(8.00000);
System.out.println(b1.equals(b2));
System.out.println(b1.compareTo(b2));
}
BigDecimal类valueOf()源码简介
public static BigDecimal valueOf(double val) {
return new BigDecimal(Double.toString(val));
}
从以上的源码,我们可以得出
她的实质是调用new BigDecimal(Double)构造函数
BigDecimal类常用方法说明
/** * 求余数 * 返回值为(this % divisor)BigDecimal */ BigDecimal remainder(BigDecimal divisor); /** * 求相反数 * 返回值是(-this)BigDecimal */ BigDecimal negate(); /** * 求比较 * 返回: * 当此 BigDecimal 在数字上小于、等于或大于 val 时 * 依次返回 -1、0 或 1 */ int compareTo(BigDecimal val);
BigDecimal工具类
package com.util;
import java.math.BigDecimal;
/**
* 提供精确的浮点数运算(包括加、减、乘、除、四舍五入)工具类
*/
public class ArithUtil {
// 除法运算默认精度
private static final int DEF_DIV_SCALE = 10;
private ArithUtil() {
}
/**
* 精确加法
*/
public static double add(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
return b1.add(b2).doubleValue();
}
/**
* 精确减法
*/
public static double sub(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
return b1.subtract(b2).doubleValue();
}
/**
* 精确乘法
*/
public static double mul(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
return b1.multiply(b2).doubleValue();
}
/**
* 精确除法 使用默认精度
*/
public static double div(double value1, double value2) throws IllegalAccessException {
return div(value1, value2, DEF_DIV_SCALE);
}
/**
* 精确除法
* @param scale 精度
*/
public static double div(double value1, double value2, int scale) throws IllegalAccessException {
if(scale < 0) {
throw new IllegalAccessException("精确度不能小于0");
}
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
// return b1.divide(b2, scale).doubleValue();
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 四舍五入
* @param scale 小数点后保留几位
*/
public static double round(double v, int scale) throws IllegalAccessException {
return div(v, 1, scale);
}
/**
* 比较大小
*/
public static boolean equalTo(BigDecimal b1, BigDecimal b2) {
if(b1 == null || b2 == null) {
return false;
}
return 0 == b1.compareTo(b2);
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


