ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BigDecimal

2021-09-22 14:30:02  阅读:213  来源: 互联网

标签:舍入 BigDecimal UP DOWN HALF ROUND


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有