Java的常用类—BigDecimal类
开发工具与关键技术:工具:myeclipse 技术: BigDecimal
作者:吴东梅
撰写时间:2019-06-01
为了能精确表示、计算浮点数,Java提供了BigDecimal类,该类提供了大量的构造器用于创建BigDecimal对象,包括把所有的基本数值型变量转换成一个BigDecimal对象,也包括利用数字字符串、数字字符数组来创建BigDecimal对象。解决Java中浮点型的精度丢失问题,在一些需要高精度计算的问题,比如金融里面的钱的计算,推荐使用BigDecimal。
BigDecimal类的常用构造器
(1)BigDecimal(char[] in) 将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与BigDecimal(String) 构造方法相同的字符序列。
(2)BigDecimal(double val) 将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
(3)BigDecimal(int val) 将 int 转换为 BigDecimal。
(4)BigDecimal(long val) 将 long 转换为 BigDecimal。
(5)BigDecimal(String val) 将 BigDecimal 的字符串表示形式转换为 BigDecimal。
代码如下:
System.out.println("---------构造器----------");
char[] cs = new char[]{‘1’,‘2’,‘3’};
BigDecimal bigDecimal1 = new BigDecimal(cs);
System.out.println(“bigDecimal1=”+bigDecimal1);
System.out.println("---------BigDecimal(double val)----------");
BigDecimal bigDecimal2 = new BigDecimal(50.0);
System.out.println(“bigDecimal2=”+bigDecimal2);
System.out.println("---------BigDecimal(int val)----------");
BigDecimal bigDecimal3 = new BigDecimal(50);
System.out.println(“bigDecimal3=”+bigDecimal3);
System.out.println("---------BigDecimal(long val)----------");
BigDecimal bigDecimal4 = new BigDecimal(50L);
System.out.println(“bigDecimal4=”+bigDecimal4);
System.out.println("---------BigDecimal(String val)----------");
BigDecimal bigDecimal5 = new BigDecimal(“50”);
System.out.println(“bigDecimal5=”+bigDecimal5);
效果图如下:
常用方法:
(1) valueOf(double val) 使用 Double.toString(double) 方法提供的double 规范的字符串表示形式将 double 转换为 BigDecimal。
(2) valueOf(long val) 将 long 值转换为具有零标度的BigDecimal。
(3) compareTo(BigDecimal val) 将此 BigDecimal 与指定的 BigDecimal 比较。
代码:
System.out.println("---------valueOf--------");
BigDecimal bigDecimal6 = BigDecimal.valueOf(100.0);
BigDecimal bigDecimal7 = BigDecimal.valueOf(50L);
System.out.println(“bigDecimal6=”+bigDecimal6);
System.out.println(“bigDecimal7=”+bigDecimal7);
//运算
System.out.println("—绝对值 + - * / ^-------------");
System.out.println(“bigDecimal6.abs()=”+bigDecimal6.abs());
System.out.println(“bigDecimal6 + bigDecimal7=”+bigDecimal6.add(bigDecimal7));
System.out.println(“bigDecimal6 - bigDecimal7=”+bigDecimal6.subtract(bigDecimal7));
System.out.println(“bigDecimal6 * bigDecimal7=”+bigDecimal6.multiply(bigDecimal7));
System.out.println(“bigDecimal6 / bigDecimal7=”+bigDecimal6.divide(bigDecimal7));
System.out.println(“bigDecimal6^3=”+bigDecimal6.pow(3));
//比较 compareTo
System.out.println("-----------compareTo-----------");
//bigDecimal6比bigDecimal7,大返回大于0的值,小返回小于0的值,相等返回0。
System.out.println(“bigDecimal6.compareTo(bigDecimal7) =”+bigDecimal6.compareTo(bigDecimal7));
效果图:
(4)toString() 返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用科学记数法。
代码:
System.out.println("-----------转为基本数据类型-----------");
byte byteValue = bigDecimal6.byteValue();
System.out.println("byteValue = "+byteValue);
short shortValue = bigDecimal6.shortValue();
System.out.println("shortValue = "+shortValue);
int intValue = bigDecimal6.intValue();
System.out.println("intValue = "+intValue);
long longValue = bigDecimal6.longValue();
System.out.println("longValue = "+longValue);
float floatValue = bigDecimal6.floatValue();
System.out.println("floatValue = "+floatValue);
double doubleValue = bigDecimal6.doubleValue();
System.out.println("doubleValue = "+doubleValue);
//toString
String str = bigDecimal6.toString();
System.out.println(“str=”+str);
效果图:
不推荐使用构造器来转换浮点型数据,会导致精度损失(并不是所有的小数转换都会造成精度损失)。
如果要转换浮点型数据,推荐使用 BigDecimal.valueOf(double) 或者 使用形参为字符串类型的构造器。
注意:在把浮点型数据转为BigDecimal时不建议使用构造器的方式,推荐使用valueOf()方法或者使用形参为字符串的构造器。原因如下的代码演示:
//演示浮点型的精度丢失问题
System.out.println(“0.06+0.01=”+(0.06+0.01));
System.out.println("1.0 - 0.38 = " + (1.0 - 0.33));
System.out.println(“4.015 * 100 = " + (4.015 * 100));
System.out.println(“1123.3 / 100 = " + (1123.3 / 100));
//不推荐使用构造器来转换浮点型数据
System.out.println(”------------------------------”);
BigDecimal decimalT1 = new BigDecimal(“0.05”);//推荐使用
BigDecimal decimalT2 = BigDecimal.valueOf(0.05);//推荐使用
BigDecimal decimalT3 = new BigDecimal(0.05);//不推荐使用
System.out.println("f1 = "+decimalT1);
System.out.println("f2 = "+decimalT2);
System.out.println("f3 = "+decimalT3);
System.out.println(“使用String作为BigDecimal构造器参数:”);
System.out.println("0.05 + 0.01 = " + decimalT1.add(decimalT2));
System.out.println("0.05 - 0.01 = " + decimalT1.subtract(decimalT2));
System.out.println("0.05 * 0.01 = " + decimalT1.multiply(decimalT2));
System.out.println("0.05 / 0.01 = " + decimalT1.divide(decimalT2));
System.out.println("0.05 ^ 2 = " + decimalT1.pow(2));
System.out.println(“使用double作为BigDecimal构造器参数:”);
System.out.println("0.05 + 0.01 = " + decimalT3.add(decimalT2));
System.out.println("0.05 - 0.01 = " + decimalT3.subtract(decimalT2));
System.out.println("0.05 * 0.01 = " + decimalT3.multiply(decimalT2));
System.out.println("0.05 / 0.01 = " + decimalT3.divide(decimalT2));
System.out.println("0.05 ^ 2 = " + decimalT3.pow(2));
效果图如下: