• BigDecimal学习笔记


    BigDecimal的运算——加减乘除

    一、函数使用

    1、尽量用字符串的形式初始化

        BigDecimal num12 = new BigDecimal("0.005");
        BigDecimal num22 = new BigDecimal("1000000");
        BigDecimal num32 = new BigDecimal("-1000000");
    

    2、加法add()函

    BigDecimal result1 = num1.add(num2);
    BigDecimal result12 = num12.add(num22);
    

    3、减法subtract()函数

    BigDecimal result2 = num1.subtract(num2);
    BigDecimal result22 = num12.subtract(num22);
    

    4、乘法multipy()函数

    BigDecimal result3 = num1.multiply(num2);
    BigDecimal result32 = num12.multiply(num22);
    

    5、除法divide()函数

    BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP);
    BigDecimal result52 = num22.divide(num12,20,BigDecimal.ROUND_HALF_UP);
    

    6、绝对值abs()函数

    BigDecimal result4 = num3.abs();
    

    7、setScale()处理java小数点

    setScale(5)表示保留五位小数,默认用四舍五入方式
    setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
    

    二、注意

    1)System.out.println()中的数字默认是double类型的,double类型小数计算不精准。

    2)使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的!

    因为不是所有的浮点数都能够被精确的表示成一个double 类型值,有些浮点数值不能够被精确的表示成 double 类型值,因此它会被表示成与它最接近的 double 类型的值。必须改用传入String的构造方法。

    三、除法divide()参数使用

    使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错。

    java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
    
    

    即为(BigDecimal 除数, int 精确小数位, int 舍入模式)

    四、八种舍入模式

    1、ROUND_UP (进1法)

    舍入远离零的舍入模式。

    在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。

    注意,此舍入模式始终不会减少计算值的大小。

    2、ROUND_DOWN(去尾法)

    接近零的舍入模式。

    在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。

    注意,此舍入模式始终不会增加计算值的大小。

    3、ROUND_CEILING (正数进1,负数去尾)

    接近正无穷大的舍入模式。

    如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;

    如果为负,则舍入行为与 ROUND_DOWN 相同。

    注意,此舍入模式始终不会减少计算值。

    4、ROUND_FLOOR (正数去尾,负数进1)

    接近负无穷大的舍入模式。

    如果 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。

    五、Java中浮点数转BigDecimal

    1、构造函数BigDecimal(String val)

    new BigDecimal(Double.toString(0.1));

    结果为 :0.1

    2、静态方法valueOf(double)

    BigDecimal.valueOf(0.1);

    结果为 :0.1

    3、反例

    new BigDecimal(0.1);

    结果为 :0.1000000000000000055511151231257827021181583404541015625

    @Test
    public void test() {
    
    
        float a = 0.1f;
    
        BigDecimal decimalA = new BigDecimal(a);
    
        System.out.println(decimalA);
    
    
        double b = 0.1;
    
        BigDecimal decimalB = new BigDecimal(b);
    
        System.out.println(decimalB);
    
    
        double c = 0.1;
    
        BigDecimal decimalC = new BigDecimal(Double.toString(c));
    
        System.out.println(decimalC);
    
    
        double d = 0.1;
    
        BigDecimal decimalD = BigDecimal.valueOf(d);
    
        System.out.println(decimalD);
    
    }
    

    控制台

    0.100000001490116119384765625
    0.1000000000000000055511151231257827021181583404541015625
    0.1
    0.1
  • 相关阅读:
    14.18 InnoDB Backup and Recovery 备份和恢复:
    14.18 InnoDB Backup and Recovery 备份和恢复:
    php使用 _before_index() 来实现访问页面前,判断登录
    php使用 _before_index() 来实现访问页面前,判断登录
    查询方式实例演示
    查询方式实例演示
    haproxy timeout server 46000 后台超时时间
    haproxy timeout server 46000 后台超时时间
    14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
    14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
  • 原文地址:https://www.cnblogs.com/dyaqi/p/12809511.html
Copyright © 2020-2023  润新知