7.javaSE --- 常用API --- BigDecimalDemol(观b站黑马程序员,笔记)

BigDecimal 类使用户能完全控制舍入行为 --- 用于小数的精确计算,表示很大的小数

        注:不可变的、任意精度的有符号的十进制数

作用:表示较大的小数和解决小数运算失真的问题

继承结构:

        public class BigDecimal extends Number implements Comparable<BigDecimal>

字段摘要:

static BigDecimalONE
          值为 1,标度为 0。
static intROUND_CEILING
          接近正无穷大的舍入模式。
static intROUND_DOWN
          接近零的舍入模式。
static intROUND_FLOOR
          接近负无穷大的舍入模式。
static intROUND_HALF_DOWN
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
static intROUND_HALF_EVEN
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
static intROUND_HALF_UP
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
static intROUND_UNNECESSARY
          断言请求的操作具有精确的结果,因此不需要舍入。
static intROUND_UP
          舍入远离零的舍入模式。
static BigDecimalTEN
          值为 10,标度为 0。
static BigDecimalZERO
          值为 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);

    }

在此处建立一个断点,然后继续向下运行

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值