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
*/
}
}