BigDecimal
可以更加精确的计算
import org.junit.Test;
import java.math.BigDecimal;
/**
* @author suizh
* @version 1.0
* @date 2021/9/17 23:05
* 构造器描述
* BigDecimal(int) 创建一个具有参数所指定整数值的对象。
* BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用
* BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
* BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用
* 方法描述
* add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
* subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
* multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
* divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
* toString() 将BigDecimal对象的数值转换成字符串。
* doubleValue() 将BigDecimal对象中的值以双精度数返回。
* floatValue() 将BigDecimal对象中的值以单精度数返回。
* longValue() 将BigDecimal对象中的值以长整数返回。
* intValue() 将BigDecimal对象中的值以整数返回。
* 八种舍入模式解释如下(除法)
* 八种舍入模式解释如下
* 1、ROUND_UP舍入远离零的舍入模式。在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
* 注意,此舍入模式始终不会减少计算值的大小。
*
* 2、ROUND_DOWN
* 接近零的舍入模式。在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
* 注意,此舍入模式始终不会增加计算值的大小。
*
* 3、ROUND_CEILING
* 接近正无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。
* 注意,此舍入模式始终不会减少计算值。
*
* 4、ROUND_FLOOR
* 接近负无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。
* 注意,此舍入模式始终不会增加计算值。
*
* 5、ROUND_HALF_UP
* 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
* 如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
* 注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
*
* 6、ROUND_HALF_DOWN
* 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
* 如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
*
* 7、ROUND_HALF_EVEN
* 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
* 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
* 如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
* 注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
* 此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
* 如果前一位为奇数,则入位,否则舍去。
* 以下例子为保留小数点1位,那么这种舍入方式下的结果。
* 1.15>1.2 1.25>1.2
*
* 8、ROUND_UNNECESSARY
* 断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
*/
public class testBigdecimal {
/**
* 加
*/
@Test
public void add(){
BigDecimal addOne = new BigDecimal("111");
BigDecimal addTwo = new BigDecimal("222");
BigDecimal add = addOne.add(addTwo);
System.out.println(add);
}
/**
* 减
*/
@Test
public void subtract(){
BigDecimal subtractOne = new BigDecimal("333.33");
BigDecimal subtractTwo = new BigDecimal("111.22");
BigDecimal subtract = subtractOne.subtract(subtractTwo);
System.out.println(subtract);
}
/**
* 乘
*/
@Test
public void multiply(){
BigDecimal multiplyOne = new BigDecimal("11.123");
BigDecimal multiplyTwo = new BigDecimal("22.234");
BigDecimal multiply = multiplyOne.multiply(multiplyTwo);
System.out.println(multiply);
}
/**
* 除
*/
@Test
public void divide(){
BigDecimal divideOne = new BigDecimal("33.234");
BigDecimal divideTwo = new BigDecimal("11");
BigDecimal divide = divideOne.divide(divideTwo,5,BigDecimal.ROUND_HALF_UP);
System.out.println(divide);
//1 ROUND_UP舍入远离零的舍入模式
BigDecimal round_up = divideOne.divide(divideTwo, 5, BigDecimal.ROUND_UP);
System.out.println("舍入远离零的舍入模式"+round_up);
//2、ROUND_DOWN 接近零的舍入模式
BigDecimal round_down = divideOne.divide(divideTwo, 5, BigDecimal.ROUND_DOWN);
System.out.println("接近零的舍入模式"+round_down);
//3、ROUND_CEILING 接近正无穷大的舍入模式
BigDecimal round_celing = divideOne.divide(divideTwo, 5, BigDecimal.ROUND_CEILING);
System.out.println("接近正无穷大的舍入模式"+round_celing);
//4、ROUND_FLOOR 接近负无穷大的舍入模式
BigDecimal round_floor = divideOne.divide(divideTwo, 5, BigDecimal.ROUND_FLOOR);
System.out.println("接近负无穷大的舍入模式"+round_floor);
//5、ROUND_HALF_UP 向“最接近的”数字舍入 四舍五入
BigDecimal round_helf_up = divideOne.divide(divideTwo, 5, BigDecimal.ROUND_HALF_UP);
System.out.println("四舍五入"+round_helf_up);
//6、ROUND_HALF_DOWN 向“最接近的”数字舍入 五舍六入
BigDecimal round_half_down = divideOne.divide(divideTwo, 5, BigDecimal.ROUND_HALF_DOWN);
System.out.println("五舍六入"+round_half_down);
//7、ROUND_HALF_EVEN 向“最接近的”数字舍入 如果是奇数ROUND_HALF_UP相同 如果是偶数 和ROUND_HALF_DOWN 相同
BigDecimal even = divideOne.divide(divideTwo, 5, BigDecimal.ROUND_HALF_EVEN);
System.out.println("如果是奇数ROUND_HALF_UP相同 如果是偶数 和ROUND_HALF_DOWN 相同"+even);
//8、ROUND_UNNECESSARY 断言请求的操作具有精确的结果 无线小数会报错
BigDecimal divideOne1 = new BigDecimal("30");
BigDecimal divideTwo1 = new BigDecimal("20");
BigDecimal unecessary = divideOne1.divide(divideTwo1, 5, BigDecimal.ROUND_UNNECESSARY);
System.out.println("断言求精确结果"+unecessary);
}
}