其他分享
首页 > 其他分享> > BigDecimal

BigDecimal

作者:互联网

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

标签:舍入,BigDecimal,UP,DOWN,HALF,ROUND
来源: https://blog.csdn.net/weixin_44066672/article/details/120414274