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); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。