BigDecimal 类使用户能完全控制舍入行为 --- 用于小数的精确计算,表示很大的小数
注:不可变的、任意精度的有符号的十进制数
作用:表示较大的小数和解决小数运算失真的问题
继承结构:
public class BigDecimal extends Number implements Comparable<BigDecimal>
字段摘要:
static BigDecimal | ONE 值为 1,标度为 0。 |
static int | ROUND_CEILING 接近正无穷大的舍入模式。 |
static int | ROUND_DOWN 接近零的舍入模式。 |
static int | ROUND_FLOOR 接近负无穷大的舍入模式。 |
static int | ROUND_HALF_DOWN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。 |
static int | ROUND_HALF_EVEN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 |
static int | ROUND_HALF_UP 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。 |
static int | ROUND_UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入。 |
static int | ROUND_UP 舍入远离零的舍入模式。 |
static BigDecimal | TEN 值为 10,标度为 0。 |
static BigDecimal | ZERO 值为 0,标度为 0。 |
注意:通过传递double类型的小数来创建对象是不可预测的:
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal(0.01);
BigDecimal bd2 = new BigDecimal(0.02);
System.out.println(bd1);
System.out.println(bd2);
}
如果想要避免这个问题,那么参数必须为字符串数据,当你用System.out.printfln(double类型的数据+double类型的数据),结果也是不可预测的,但是使用BigDecimal创建对象,参数为字符串类型的数据
和BigInteger一样,可以用静态方法获取BigDecimal对象:BigDecimal 对象名 = BigDecimal.valueOf(数据类型的数据)
细节:
1.如果要表示的数字不大,没有超出double的取值范围,建议使用静态方法
2.如果要表示的数字比较大,超出了double的取值范围,建议使用构造方法
3.如果我们传递的是0~10之间的整数(包括0和10),那么方法会返回其方法本身就创建好的对象,不会重新new一个对象,其目的也是为了节约内存,但是需要注意,假设我们要比较两个对象,第一个传进去的是int类型的数据,如果你第二个传进去的double类型的数据,那么方法本身不管你第一个传进去的是int还是double,第二个都会new一个对象,而此时它们的地址就不相同,返回值也为false,如果文字信息看不懂,接下来代码演示
public class BigInteger1 {
public static void main(String[] args) {
//int类型
BigDecimal bd1 = BigDecimal.valueOf(10);
//double类型
BigDecimal bd2 = BigDecimal.valueOf(10.0);
//比较
System.out.println(bd1 == bd2);
}
可以看到,第一个为10,第二个为10.0,而比较结果为false,valueOf(double)的源代码就是新建了一个对象,所以地址值一定会不一样。
常见方法:
1.(静态方法)valueOf(double val) --- 获取对象
2.add(BigDecimal val) --- 加法
3. subtract(BigDecimal val) --- 减法
4.multiply(BigDecimal val) --- 乘法
5.divide(BigDecimal val) --- 除法
注:此方法只适用可除尽的数据,如果除出来的是无理数,那么就会出错,此时就要用下面的方法了
6.divide(BigDecimal val , 精确位数,舍入模式) --- 除法
舍入模式:RundingMode(枚举),它也是一个类,它有很多属性:
1.UP --- 远离0舍入
2.DOWN --- 靠近0舍入
3.CELING --- 向上舍入
4.FLOOR --- 向下舍入
5.HALF_UP --- 四舍五入
6.HALF_DOWN --- 与四舍五入的方式唯一的区别就在于对于0.5界的判断,HALF_UP是向上,HALF_DOWN是向下
(这些舍入模式不用去背,基本上用的都HALF_UP,如果有需要再从API里面找就行了,这里只是做个了解)
扩展(BigDecimal的存储方式):
BigInteger的存储方式为让二进制(数据在电脑里都以二进制表示)转换为以组的形式存储,而BigDecimal的存储方式是本身参数为一个字符串,那么字符串就成为一个字符类型的数组,将每个字母、符号都转换为数组中的元素,再转化为每个字符的ASCII码的方式进行存储,让字符类型的数组成为一个字节类型的数组
public static void main(String[] args) {
BigDecimal bd1 = BigDecimal.valueOf(0.226);
}
在此处建立一个断点,然后继续向下运行