package com.cr.test; 



 import java.math.BigDecimal; 

 import java.math.MathContext; 

 import java.math.RoundingMode; 



 public class JavaBigDecimal { 



public static void main(String[] args) { 

/* 

* 使用BigDecimal类进行运算之前需要将需要进行运算的数据转换成BigDecimal类型 

*  

*/ 

int i=10; 

BigDecimal i1 = new BigDecimal(i); 

System.out.println(i1); 

/* 

* 下面通过BigDecimal类来处理char类型,打印其前后的值可以发现 

* 其中是char类型的值是与之对应ASCII码值 

*/ 

char c = '>'; 

char char1 = 'a'; 

char char2 = 'A'; 

BigDecimal c1 = new BigDecimal(c); 

BigDecimal c2 = new BigDecimal(char1); 

BigDecimal c3 = new BigDecimal(char2); 

System.out.println(c1);//打印值是62 

System.out.println(c2);//打印值是97 

System.out.println(c3);//打印值是65 

/* 

* 下面通过BigDecimal类来处理double类型,打印其前后的值可以发现 

* 直接将double类型转换成BigDecimal类型精度会丢失 

* 而将double类型转换成String类型再转换成BigDecimal类型则精度不会发生变化 

*/ 

double d =1.2354; 

BigDecimal d1 = new BigDecimal(d); 

System.out.println(d);//打印值是1.2354 

System.out.println(d1);//打印值是1.2354000000000000536459765498875640332698822021484375 

String str = String.valueOf(d); 

BigDecimal d2 = new BigDecimal(str); 

System.out.println(d2);//打印值是1.2354 

long L =123456789012453156L; 

BigDecimal L1 = new BigDecimal(L); 

System.out.println(L1); 

/* 

* 下面通过BigDecimal类来处理String类型, 

* 做此操作时必须注意String类型的值必须是可以转化为数字的值, 

* 否则报错(java.lang.NumberFormatException) 

*/ 

String s = "-123456.08897146566"; 

BigDecimal s1 = new BigDecimal(s); 

System.out.println(s1); 

/* 

* abs()取其绝对值 

* abs(MathContext mc)根据上下文设置进行舍入 

*/ 

//前面的10表示取10位数,RoundingMode.HALF_UP其实就是四舍五入 

MathContext m = new MathContext(10,RoundingMode.HALF_UP); 

System.out.println(s1.abs()); 

System.out.println(s1.abs(MathContext.DECIMAL32)); 

System.out.println(s1.abs(MathContext.DECIMAL64)); 

System.out.println(s1.abs(MathContext.DECIMAL128)); 

System.out.println(s1.abs(MathContext.UNLIMITED)); 

System.out.println(s1.abs(m)); 

/* 

* add(BigDecimal augend)使用此方法进行加法运算不会丢失精度 

* add(BigDecimal augend,MathContext mc)使用此方法进行加法运算可以根据上下文设置进行舍入 

*/ 

System.out.println(i1.add(d2));//11.2354 

System.out.println(d1.add(d2));//2.4708000000000000536459765498875640332698822021484375 

System.out.println(d1.add(d2,m));//2.470800000 

/* 

* subtract(BigDecimal augend)使用此方法进行减法运算不会丢失精度 

* subtract(BigDecimal augend,MathContext mc)使用此方法进行减法运算可以根据上下文设置进行舍入 

*/ 

System.out.println(i1.subtract(d1));//8.7645999999999999463540234501124359667301177978515625 

System.out.println(i1.subtract(d2));//8.7646 

System.out.println(i1.subtract(d1,m));//8.764600000 

/* 

* multiply(BigDecimal augend)使用此方法进行乘法运算不会丢失精度 

* multiply(BigDecimal augend,MathContext mc)使用此方法进行乘法运算可以根据上下文设置进行舍入 

*/ 

System.out.println(i1.multiply(d1));//12.3540000000000005364597654988756403326988220214843750 

System.out.println(i1.multiply(d2));//12.3540 

System.out.println(i1.multiply(d1,m));//12.35400000 

/* 

* 使用BigDecimal进行除法运算时必须注意两点: 

* 一、被除数必须是不等于0的BigDecimal类型,否则报错 

* 二、最后对商的取值加以限制,否则一旦无法整除就会报错 

* divide(BigDecimal divisor,int scale,RoundingMode roundingMode) 

* 强烈推荐使用这种方法,只要divisor不为零,并且在roundingMode==RoundingMode.UNNECESSARY时 

* 能被整除就不会报错 

*/ 

System.out.println(i1.divide(new BigDecimal("3") , 4,RoundingMode.HALF_UP));//3.3333 

/* 

* 此法不推荐使用 

* divide(BigDecimal divisor),使用此法一旦无法整除就会报错(java.lang.ArithmeticException) 

* System.out.println(i1.divide(d1)); 

* java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 

*/ 

/* 

*此法不推荐使用  

* divide(BigDecimal divisor,RoundingMode roundingMode) 

* 使用此方法进行除法运算会根据舍入模式进行舍入 

* System.out.println(i1);//10 

* System.out.println(d1);//1.2354000000000000536459765498875640332698822021484375 

* System.out.println(i1.divide(d1,RoundingMode.HALF_UP));//8 

* System.out.println(i1.divide(new BigDecimal("3"),RoundingMode.HALF_UP));//3 

*/ 

/* 

* 此法不推荐使用 

* divide(BigDecimal divisor,MathContext mc),使用此法如果结果不准确,但是舍入模式为 UNNECESSARY 或 mc.precision == 0,并且商值具有无穷的十进制扩展就会报错(java.lang.ArithmeticException) 

* System.out.println(i1.divide(d1,m)); 

* java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 

*/ 

/* 

* divideToIntegralValue(BigDecimal divisor)使用此法会得到商的商数部分 

*/ 

System.out.println(i1.divideToIntegralValue(new BigDecimal("4"))); 

/* 

* remainder(BigDecimal divisor)使用此法会得到商的余数部分 

*/ 

System.out.println(i1.remainder(new BigDecimal("4.2"))); 

System.out.println("******************"); 

/* 

* pow(int n) 

* System.out.println(i1.pow(100000)); 

*/ 

/* 

* doubleValue()可以将BigDecimal 转换为 double 

* floatValue()可以将BigDecimal 转换为 float 

* 同样也可以转化int、byte、short、long如果此 BigDecimal 具有非零小数部分,或者超出 其结果的可能范围,则抛出 ArithmeticException。 

* toString()可以将BigDecimal 转换为 String 

*/ 

 

} 

 

 }