跟随狂神学Java-18,String类

第十八天:BigDecimal

哪一场战不难打,越难打,越要打

狂神未更新,转千锋教育 (bilibili.com)

学习内容

引入
  • 思考:以下程序的输出结果是多少

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package com.joker_yue.javalearn.bigDecimal;

    public class BigDecimal {
    public static void main(String[] args) {
    double d1= 1.0;
    double d2= 0.9;
    System.out.println(d1-d2);
    }
    }
  • 上述结果为

    1
    0.09999999999999998
  • 我们再来试试这个

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package com.joker_yue.javalearn.bigDecimal;

    public class BigDecimal {
    public static void main(String[] args) {
    double d1= 1.0;
    double d2= 0.9;
    System.out.println(d1-d2);

    double result = (1.4-0.5)/0.9;
    System.out.println(result);

    }
    }
  • 输出结果为

    1
    2
    0.09999999999999998
    0.9999999999999999
  • 原因是浮点类型的精度丢失。所以我们需要一个进度更高的类


BigDecimal
  • 位置:java.math包

  • 作用:精确计算浮点数

  • 创建方式:BigDecimal bd = new BigDecimal(“1.0”);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.joker_yue.javalearn.bigDecimal;
import java.math.BigDecimal;

public class BD {
public static void main(String[] args) {
//BigDecimal:大的浮点数的计算
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");

//减法
BigDecimal r1 = bd1.subtract(bd2);
System.out.println(r1);
//加法
BigDecimal r2 = bd1.add(bd2);
System.out.println(r2);

//乘法
BigDecimal r3 = bd1.multiply(bd2);
System.out.println(r3);

//除法
BigDecimal r4 = new BigDecimal("1.4").subtract(new BigDecimal("0.5")).divide(new BigDecimal("0.9"));
//(1.5-0.5)/0.9
System.out.println(r4);

}
}

上述代码的输出结果为

1
2
3
4
0.1
1.9
0.90
1

但是我们这样写

1
2
BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3"));
System.out.println(r5);

将会报错:

1
2
3
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.base/java.math.BigDecimal.divide(BigDecimal.java:1766)
at com.joker_yue.javalearn.bigDecimal.BD.main(BD.java:26)

因为这个是除不尽的。所以我们需要说明保留几位小数

1
2
3
4
BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP);
//其中 public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode),
//中间divisor是除数,scale是保留位数,roundingMode是进位方法(这里我们选择四舍五入进位)
System.out.println(r5);

最后的输出结果为

1
3.33

总结
  • 方法

    • BigDecimal add(BigDecimal bd) 加
    • BigDecimal substract(BigDecimal bd) 减
    • BigDecimal multiply(BigDecimal bd) 乘
    • BigDecimal divide(BigDecimal bd) 除