java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
初始化BigDecimal对象
加减乘除
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
取反
negate()
比较
compareTo(BigDecimal)
示例:a.compareTo(b)
a>b 返回1
a=b 返回0
a<b 返回-1
设置小数点精确度
// 1. ROUND_DOWN(直接省略掉指定位数后的内容) BigDecimal bigDecimal = new BigDecimal("2.123456").setScale(2, BigDecimal.ROUND_DOWN); System.out.println("ROUND_DOWN:" + bigDecimal);//2.12 // 2. ROUND_UP(直接对指定位数后的内容做进一位处理) BigDecimal bigDecimal2 = new BigDecimal("2.125456").setScale(2, BigDecimal.ROUND_UP); System.out.println("ROUND_UP:" + bigDecimal2);//2.13 // 3. ROUND_CEILING(正数使用ROUND_UP 规则,负数使用ROUND_DOWN 规则) BigDecimal bigDecimal3 = new BigDecimal("2.125456").setScale(2, BigDecimal.ROUND_CEILING); System.out.println("ROUND_CEILING:" + bigDecimal3);//2.13 BigDecimal bigDecimal4 = new BigDecimal("-2.125456").setScale(2, BigDecimal.ROUND_CEILING); System.out.println("ROUND_CEILING:" + bigDecimal4);//-2.12 // 4. ROUND_FLOOR(正数省略内容,负数向下进一位) BigDecimal bigDecimal5 = new BigDecimal("2.125456").setScale(2, BigDecimal.ROUND_FLOOR); System.out.println("ROUND_FLOOR:" + bigDecimal5);//2.12 BigDecimal bigDecimal6 = new BigDecimal("-2.125456").setScale(2, BigDecimal.ROUND_FLOOR); System.out.println("ROUND_FLOOR:" + bigDecimal6);//-2.13 // 5. ROUND_HALF_UP,ROUND_HALF_DOWN(四舍五入) BigDecimal bigDecimal7 = new BigDecimal("2.125456").setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("ROUND_HALF_UP:" + bigDecimal7);//2.13 BigDecimal bigDecimal8 = new BigDecimal("-2.125456").setScale(2, BigDecimal.ROUND_HALF_DOWN); System.out.println("ROUND_HALF_DOWN:" + bigDecimal8);//-2.13 // 6. ROUND_HALF_EVEN(指定小数位的前一位如果是奇数则四舍五入后进位,如果是偶数则舍弃指定小数位后面内容) BigDecimal bigDecimal9 = new BigDecimal("2.113").setScale(2, BigDecimal.ROUND_HALF_EVEN); System.out.println("ROUND_HALF_EVEN:" + bigDecimal9);//2.11 虽然是奇数,但是3<5,不会进位 BigDecimal bigDecimal10 = new BigDecimal("2.115").setScale(2, BigDecimal.ROUND_HALF_EVEN); System.out.println("ROUND_HALF_EVEN:" + bigDecimal10);//2.12 因为是奇数且符合"五入",则进位 // 此舍入模式也称为“银行家舍入法”。四舍六入,五分两种情况。 // 如果前一位为奇数,则入位,否则舍去。 // 8.ROUND_UNNECESSARY(断言请求的操作具有精确的结果,因此不需要舍入。) // 如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException