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);

效果图如下:

Decimal 对于 JAVA类型 xml java中decimal是什么类型_System


常用方法:

(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));

效果图:

Decimal 对于 JAVA类型 xml java中decimal是什么类型_System_02


(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);

效果图:

Decimal 对于 JAVA类型 xml java中decimal是什么类型_System_03


不推荐使用构造器来转换浮点型数据,会导致精度损失(并不是所有的小数转换都会造成精度损失)。

如果要转换浮点型数据,推荐使用 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));

效果图如下:

Decimal 对于 JAVA类型 xml java中decimal是什么类型_构造器_04