javabigdecimal赋值_Java中BigDecimal类介绍及⽤法
Java中提供了⼤数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,⽤于⾼精度计算.
其中 BigInteger 类是针对⼤整数的处理类,⽽ BigDecimal 类则是针对⼤⼩数的处理类.
BigDecimal 类的实现⽤到了 BigInteger类,不同的是 BigDecimal 加⼊了⼩数的概念.
float和Double只能⽤来做科学计算或者是⼯程计算;在商业计算中,对数字精度要求较⾼,必须使⽤ BigInteger 类和 BigDecimal 类,它⽀持任何精度的定点数,可以⽤它来精确计算货币值.
BigDecimal类创建的是对象,不能使⽤传统的+、-、*、/等算术运算符直接对其进⾏数学运算,⽽必须调⽤其对应的⽅法.⽅法的参数也必须是BigDecimal类型的对象.
⼀、构造BigDecimal 对象常⽤⽅法
1、⽅法⼀
BigDecimal BigDecimal(double d); //不允许使⽤
2、⽅法⼆
BigDecimal BigDecimal(String s); //常⽤,推荐使⽤
3、⽅法三
static BigDecimal valueOf(double d); //常⽤,推荐使⽤
注意:
1. double 参数的构造⽅法,不允许使⽤因为它不能精确的得到相应的值,值会变⼤;
2. String 构造⽅法是完全可预知的: 写⼊ new BigDecimal("0.1") 将创建⼀个 BigDecimal,它正好等于预期的0.1; 因此,通常建议优先使⽤String 构造⽅法;
3. 静态⽅法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的⾸选⽅法;
测试代码如下:
packagecom.qiyuan.util;importjava.math.BigDecimal;public classorderCode {public static voidmain(S
tring[] args) {double d1 = 0.10334;double d2 = 1234.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+"))=" + newBigDecimal(String.valueOf(d1)));
System.out.println("new BigDecimal(String.valueOf("+d2+"))=" + newBigDecimal(String.valueOf(d2)));
System.out.println("");
System.out.println("new BigDecimal(String.valueOf("+d1+"))=" + String(d1)));
System.out.println("new BigDecimal(String.valueOf("+d2+"))=" + String(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(1);
BigDecimal b2= BigDecimal.valueOf(1.00000);
System.out.println(b1.equals(b2));
System.out.println(b1pareTo(b2));
}
}
输出如下:
new BigDecimal(0.10334)=0.10334000000000000130118138486068346537649631500244140625
new BigDecimal(1234.0)=1234
new BigDecimal(String.valueOf(0.10334))=0.10334
new BigDecimal(String.valueOf(1234.0))=1234.0
new BigDecimal(String.valueOf(0.10334))=0.10334
new
BigDecimal(String.valueOf(1234.0))=1234.0BigDecimal.valueOf(0.10334)=0.10334BigDecimal.valueOf(1234.0)=1234.0 false
⼆、BigDecimal保留⼩数位
public static void main(String[] args) throwsIllegalAccessException {
BigDecimal decimal= new BigDecimal("1.12345");
System.out.println(decimal);
BigDecimal setScale= decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN);
System.out.println(setScale);
BigDecimal setScale1= decimal.setScale(4,BigDecimal.ROUND_HALF_UP);
System.out.println(setScale1);
}
参数定义
ROUND_CEILING
Rounding mode to round towards positive infinity.
向正⽆穷⽅向舍⼊
ROUND_DOWN
Rounding mode to round towards zero.
向零⽅向舍⼊
ROUND_FLOOR
Rounding mode to round towards negative infinity.
向负⽆穷⽅向舍⼊
ROUND_HALF_DOWN
Rounding mode to round towards"nearest neighbor" unless both neighbors are equidistant, in which caseround down.
向(距离)最近的⼀边舍⼊,除⾮两边(的距离)是相等,如果是这样,向下舍⼊, 例如1.55 保留⼀位⼩数结果为1.5ROUND_HALF_EVEN
Rounding mode to round towards the"nearest neighbor" unless both neighbors are equidistant, in wh
ich case, round towards the even neighbor.
向(距离)最近的⼀边舍⼊,除⾮两边(的距离)是相等,如果是这样,如果保留位数是奇数,使⽤ROUND_HALF_UP ,如果是偶数,使⽤ROUND_HALF_DOWN
ROUND_HALF_UP
Rounding mode to round towards"nearest neighbor" unless both neighbors are equidistant, in which caseround up.
向(距离)最近的⼀边舍⼊,除⾮两边(的距离)是相等,如果是这样,向上舍⼊,1.55保留⼀位⼩数结果为1.6ROUND_UNNECESSARY Rounding mode toassertthat the requested operation has an exact result, hence no rounding is necessary.
计算结果是精确的,不需要舍⼊模式
ROUND_UP
Rounding mode to round away from zero.
向远离0的⽅向舍⼊
附件1,BigDecimal 类的 valueOf()⽅法源码
public static BigDecimal valueOf(doubleval) {return String(val));
}
附件2,BigDecimal类的⼏个常⽤⽅法
/*** 求余数
* 返回值为 (this % divisor) 的 BigDecimal*/BigDecimal remainder(BigDecimal divisor);/*** 求相反数
* 返回值是 (-this) 的 BigDecimal*/BigDecimal negate();/*** 将此 BigDecimal 与指定的 BigDecimal ⽐较
* 根据此⽅法,值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的;
* 相对六个 boolean ⽐较运算符 (, >=, !=, <=) 中每⼀个运算符的各个⽅法,优先提供此⽅法;
* 建议使⽤以下语句执⾏上述⽐较:(xpareTo(y) 0), 其中 是六个⽐较运算符之⼀;
*
* 指定者:接⼝ Comparable 中的 compareTo
* 返回:当此 BigDecimal 在数字上⼩于、等于或⼤于 val 时,返回 -1、0 或 1*/
int compareTo(BigDecimal val);
附件3,提供精确的浮点数运算(包括加、减、乘、除、四舍五⼊)的⼯具类源码
packagecom.qiyuan.util;importjava.math.BigDecimal;public classArithUtil {//除法运算默认精度
private static final int DEF_DIV_SCALE = 10;privateArithUtil() {
}/*** 精确加法*/
public static double add(double value1, doublevalue2) {
BigDecimal b1=BigDecimal.valueOf(value1);
BigDecimal b2=BigDecimal.valueOf(value2);returnb1.add(b2).doubleValue();
}/*** 精确减法*/
public static double sub(double value1, doublevalue2) {
BigDecimal b1=BigDecimal.valueOf(value1);
BigDecimal b2=BigDecimal.valueOf(value2);returnb1.subtract(b2).doubleValue();
}/*** 精确乘法*/
public static double mul(double value1, doublevalue2) {
BigDecimal b1=BigDecimal.valueOf(value1);
BigDecimal b2=BigDecimal.valueOf(value2);returnb1.multiply(b2).doubleValue();
}/*** 精确除法 使⽤默认精度*/
public static double div(double value1, double value2) throwsIllegalAccessException {returndiv(value1, value2,
DEF_DIV_SCALE);
}/*** 精确除法
*@paramscale 精度*/
public static double div(double value1, double value2, int scale) throwsIllegalAccessException {if(scale < 0) {throw new IllegalAccessException("精确度不能⼩于0");
}
BigDecimal b1=BigDecimal.valueOf(value1);
BigDecimal b2=BigDecimal.valueOf(value2);//return b1.divide(b2, scale).doubleValue();
returnb1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}/*** 四舍五⼊
*@paramscale ⼩数点后保留⼏位*/
public static double round(double v, int scale) throwsIllegalAccessException {return div(v, 1, scale);
}/*** ⽐较⼤⼩*/
public static booleanequalTo(BigDecimal b1, BigDecimal b2) {if(b1 == null || b2 == null) {return false;
}return 0 ==b1pareTo(b2);
}public static void main(String[] args) throwsIllegalAccessException {double value1=1.2345678912311;double
value2=9.1234567890123;
BigDecimal value3=String(value1));
BigDecimal value4=String(value2));
System.out.println("精确加法================="+ArithUtil.add(value1, value2));
System.out.println("精确减法================="+ArithUtil.sub(value1, value2));
System.out.println("精确乘法================="+ArithUtil.mul(value1, value2));
System.out.println("精确除法 使⽤默认精度 ================="+ArithUtil.div(value1, value2)); System.out.println("精确除法 设置精度================="+ArithUtil.div(value1, value2,20)); System.out.println("四舍五⼊ ⼩数点后保留⼏位 ================="+und(value1, 10)); System.out.println("⽐较⼤⼩ ================="+ArithUtil.equalTo(value3, value4));
}
bigdecimal除法保留小数}