BIgDeimal的加减乘除和大小比较
BIgDeimal的加减乘除和大小比较
- BigDecimal,是除了8个基本数据类型之外,我们又经常使用的一种数据类型。因为他的可变精度范围,所以经常被使用与价格,计算百分比等。但是BigDecimal所创建的是对象,所以在使用上和其他的数据类型不一样,下面详细看看。
1.BigDecimal概述
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。
一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象大小的比较
2.Bigdecimal 的常用构造方法
//尽量用字符串的形式初始化,可以提高精度
BigDecimal bigDecimal1 = new BigDecimal(33.33);
BigDecimal bigDecimal2 = new BigDecimal("33.33");
BigDecimal bigDecimal3 = BigDecimal.valueOf(33.33);
BigDecimal bigDecimal4 = BigDecimal.ZERO;
System.out.println(bigDecimal1); //33.3299999999999982946974341757595539093017578125
System.out.println(bigDecimal2); //33.33
System.out.println(bigDecimal3); //33.33
System.out.println(bigDecimal4); //0
3.Bigdecimal 大小的比较compareTo( )
//尽量用字符串的形式初始化,可以提高精度
BigDecimal bigdemical1 = new BigDecimal("0.005");
BigDecimal bigdemical2 = new BigDecimal("1000000");
BigDecimal bigdemical3 = new BigDecimal("-1000000");
int a = bigdemical.compareTo(bigdemical2); //-1
a = 1,表示bigdemical大于bigdemical2;
a = 0,表示bigdemical等于bigdemical2;
a = -1,表示bigdemical小于bigdemical2;
4.Bigdecimal 的加减乘除
- 加法 add()函数 减法subtract()函数 乘法multiply()函数 除法divide()函数 绝对值abs()函数
//加法
BigDecimal result1 = num1.add(num2);
BigDecimal result12 = num12.add(num22);
//减法
BigDecimal result2 = num1.subtract(num2);
BigDecimal result22 = num12.subtract(num22);
//乘法
BigDecimal result3 = num1.multiply(num2);
BigDecimal result32 = num12.multiply(num22);
//绝对值
BigDecimal result4 = num3.abs();
BigDecimal result42 = num32.abs();
//除法
BigDecimal bigDecimal5 = new BigDecimal("4");
BigDecimal bigDecimal6 = new BigDecimal("8");
BigDecimal bigDecimal7 = new BigDecimal("16.00");
BigDecimal bigDecimal8 = new BigDecimal("3");
BigDecimal result1 = bigDecimal6.divide(bigDecimal5);
System.out.println(result1); 2
BigDecimal result2 = bigDecimal7.divide(bigDecimal6);
System.out.println(result2); //2.00
//此处会直接报错,因为除不尽的数,会导致超过范围
//BigDecimal result3 = bigDecimal5.divide(bigDecimal8);
BigDecimal result3 = bigDecimal5.divide(bigDecimal8, 5, BigDecimal.ROUND_HALF_UP);
System.out.println(result3); //1.33333 ,此处为四舍五入
/*
除法divide()参数使用
使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错
我们可以看到divide函数配置的参数如下
即为 (BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)
*/