Day02——变量、Java基本数据类型、基本类型转换、数据类型扩展BigDecimal

Day02

变量

存储数据的盒子

不使用变量:

  • 同一数据需要重复编写
  • 数据变化需要大量改动代码

使用变量:

  • 一次定义,多次使用
  • 随时随地,依需可变

变量声明

变量声明包含数据类型和变量名两部分

int a;
int b;
int c,d,e; //同时声明三个变量

变量初始化

对变量的首次赋值

int a = 10;
float b = 10.1;

int a=2, b=3, c=4; //同时给三个整型变量赋值

int f;
f=30; //先声明再赋值

变量的访问

对变量的访问即是对变量中所存数据的访问

可将变量值直接输出(未声明或未初始化的变量均不能输出

int a = 10;
System.out.println(a);
//System.out.println("a"); //输出的是字符a

可对变量进行运算

int b = 10;
b += 10; //b自增10,=20

变量的命名

  • 符合Java标识符的规则
  • 只能包含字母、数字、_和$,且不能以数字开头
  • 不能使用Java中规定的关键字
  • 建议:使用见名知意命名方式,驼峰命名法

java基本类型

八大基本数据类型

整数类型

范围大小不同

  • byte

  • short

  • int

    整数默认都是int,占四个字节,范围 -231 ~ 231-1(正负21个多亿)

    特点:①超出范围编译错误,例如100 0000 0000(100亿超范围)

    ​ ② int只能存整数,赋值小数则报错

    ​ ③ 两整数做除法,结果一定为整数,若结果含小数,则直接舍弃小数位,不存在四舍五入

    ​ ④运算时超出范围,则会产生溢出(溢出不是错误,但需要避免

请添加图片描述

final int MAX_INT = Integer.MAX_VALUE;  //MAX_INT = 2147483647
System.out.println(MAX_INT);
System.out.println(MAX_INT + 1);  //Out: -2147483648
System.out.println(MAX_INT + 2);  //Out: -2147483647
System.out.println(MAX_INT + 3);  //Out: -2147483646
System.out.println(MAX_INT + 4);  //Out: -2147483645
System.out.println(MAX_INT + 5);  //Out: -2147483644

产生此现象的原因,正数最大溢出一位到达负数最小位置

请添加图片描述

  • long

    长整型,占8个字节,范围**-263 ~ 263-1**

    初始化long数据类型时,要在数字后加L,不加的话默认是int类型,会产生编译错误

    long a = 10000000000; //编译错误,超范围
    long b = 10000000000L; //不报错
    

    运算时若有可能产生溢出,建议在第一个数字后加L

    long e = 10000000000*3*10L; //溢出,计算10000000000*3时已经发生溢出
    long f = 10000000000L*3*10; //正常运算
    

浮点类型

精度值不同

  • float

  • double

    双精度浮点型,小数默认为double类型,占8个字节,在数字后加 F 可转换为float类型

    不能表示精确数据,运算时可能会发生舍入误差,若想在浮点数运算时不产生误差,使用BigDecimal类型

    // 计算0.1 + 0.2
    double result = 0.1 + 0.2;
    System.out.println("0.1 + 0.2 = " + result); //out: 0.30000000000000004
    

字符型 char

字符类型,占用两个字节

字符型的直接两放在单引号’ '中,有且必须且只能由一个字符,对于空字符则要在单引号之间敲一个空格

char c1 = 'f';
char c2 = '5';
char c3 = ' ';

采用Unicode编码格式(特点:一个字符对应一个码),ASCII码范围在0~65535之间

char c6 = 65; 
char c7 = 'A'; //两句含义相同

转义符:

对于特殊的符号,若想成功展示则需要通过 \ 来转义

char c4 = '\’'; //输出一个单引号’
char c5 = '\\'; //输出一个反斜杠\

布尔型 boolean

只含 true 和 false 两个值,存储其他数据报错。


扩展——BigDecimal

计算中无精度损失,常用与银行金融系统

初始化数据

BigDecimal无法直接进行赋值,需要创建BigDecimal对象

BigDecimal bigDecimal = new BigDecimal(0.9);

BigDecimal数据比较

BigDecimal无法直接与整数、浮点数进行比较,需要通过***conpareTo()***方法进行比较

[!NOTE]

API——conpareTo():

​ 格式:BigDicimal1.compareTo(BigDicimal2)

​ 返回:int

​ 判断:若前数大于后数,则返回值大于0;

​ 若前数小数后数,则返回值小于0;

​ 若前数等于后数,则返回值等于0。

//判断输入的数据是否大于500
Scanner sc = new Scanner(System.in);
BigDecimal num = sc.nextBigDecimal();
int result = num.compareTo(new BigDecimal(500)) >= 0;

BigDecimal的八种舍入模式

BigDecimal.ROUND_UP
BigDecimal.ROUND_DOWN
BigDecimal.ROUND_CEILING
BigDecimal.ROUND_FLOOR
BigDecimal.ROUND_HALF_UP
BigDecimal.ROUND_HALF_DOWN
BigDecimal.ROUND_HALF_EVEN
BigDecimal.ROUND_UNNECESSARY

舍入模式使用场景:

//直接给数字设置舍入,设置2表示最终保留2为小数,采用的舍入模式为ROUND_UP
new BigDecimal(0.8).setScale(2, BigDecimal.ROUND_UP)
//Bigdecimal的除法, 1.05÷2,保留两位小数,采用ROUND_DOWN
new BigDecimal(1.105)).divide(new BigDecimal(2),2,BigDecimal.ROUND_DOWN)
  • BigDecimal.ROUND_UP

    进位处理,对应小数位后一位采取直接进位(不是四舍五入,<=4也进位),无论正负

    BigDecimal scale = new BigDecimal(1.2).setScale(0, BigDecimal.ROUND_UP);
    BigDecimal scale1 = new BigDecimal(-1.2).setScale(0, BigDecimal.ROUND_UP);
    System.out.println("scale = " + scale);//scale = 2
    System.out.println("scale1 = " + scale1);//scale1 = -2
    
  • BigDecimal.ROUND_DOWN

    该舍入模式不会增加计算值的大小,直接舍弃对应小数位后面的小数,不考虑任何进位

    BigDecimal scale3 = new BigDecimal(-1.2568).setScale(2, BigDecimal.ROUND_DOWN);
    BigDecimal scale4 = new BigDecimal(1.2568).setScale(2, BigDecimal.ROUND_DOWN);
    System.out.println("scale3 = " + scale3);//scale3 = -1.25
    System.out.println("scale4 = " + scale4);//scale4 = 1.25
    
  • BigDecimal.ROUND_CEILING

    该模式向正无穷四舍五入,是 ROUND_UP 和ROUND_DOWN 的组合,

    如果 BigDecimal 为正数,则行为与 ROUND_UP 相同;如果 BigDecimal 为负数,则行为与 ROUND_DOWN 相同。

    BigDecimal scale5 = new BigDecimal(-1.2568).setScale(2, BigDecimal.ROUND_CEILING);
    BigDecimal scale6 = new BigDecimal(1.2568).setScale(2, BigDecimal.ROUND_CEILING);
    BigDecimal scale7 = new BigDecimal(1.2528).setScale(2, BigDecimal.ROUND_CEILING);
    System.out.println("scale5 = " + scale5);//scale5 = -1.25
    System.out.println("scale6 = " + scale6);//scale6 = 1.26
    System.out.println("scale7 = " + scale7);//scale7 = 1.26
    
  • BigDecimal.ROUND_FLOOR

    该模式向负无穷四舍五入,也是 ROUND_UP 和 ROUND_DOWN 的组合,但是和ROUND_CEILING 是相反的。

    如果 BigDecimal 为正数,则行为与 ROUND_DOWN 相同;如果为负数,则行为与 ROUND_UP 相同。

  • BigDecimal.ROUND_HALF_UP

    该模式向“最近的邻居”四舍五入。如果丢弃的分数是≥ 0.5,则行为与ROUND_UP相同;否则,行为与ROUND_DOWN相同。(即基础的四舍五入,04不进,59进)

    BigDecimal scale8 = new BigDecimal("5.5").setScale(0, BigDecimal.ROUND_HALF_UP);// 6
    BigDecimal scale9 =new BigDecimal("1.6").setScale(0, BigDecimal.ROUND_HALF_UP); // 2
    BigDecimal scale10 =new BigDecimal("1.0").setScale(0, BigDecimal.ROUND_HALF_UP); // 1
    BigDecimal scale11 =new BigDecimal("-1.0").setScale(0, BigDecimal.ROUND_HALF_UP); // -1
    BigDecimal scale12 =new BigDecimal("-1.6").setScale(0, BigDecimal.ROUND_HALF_UP); // -2
    BigDecimal scale13 =new BigDecimal("-5.5").setScale(0, BigDecimal.ROUND_HALF_UP); // -6
    System.out.println("scale8 = " + scale8);
    System.out.println("scale9 = " + scale9);
    System.out.println("scale10 = " + scale10);
    System.out.println("scale11 = " + scale11);
    System.out.println("scale12 = " + scale12);
    System.out.println("scale13 = " + scale13);
    
  • BigDecimal.ROUND_HALF_DOWN

    五舍六入,如果丢弃的分数是> 0.5,则行为与ROUND_UP相同;否则,行为与ROUND_DOWN相同。

  • BigDecimal.ROUND_HALF_EVEN

  • BigDecimal.ROUND_UNNECESSARY


基本类型转换

自动(隐式)类型转换

从小类型到大类型

基本数据类型从小到大依次为:

byte
short
int
long
float
double
char
int a = 5;
long b = a; //自动类型转换 小int --> long大
int c = b; //编译错误,无法从大long到小int转换,必须使用强制类型转换
int c = (int)b;

显式类型转换

int num1 = 10;
long num2 = (long) num1; // 将int类型转换为long类型

两种特殊情况

  • 强转添加小数

    long d = 5;
    double e = 5;
    System.out.println(d);
    System.out.println(e);//输出5.0,默认保留一位小数,5 --> double
    System.out.println(d == e);//输出true,int --> double
    
  • 强转发生溢出

    long f = 52000000000000L;
    int g = (int) f;
    System.out.println(g); //溢出
    

    强转丢失精度

    double h = 5.1;
    int i = (int) h;
    System.out.println(i);//输出5,丢失精度
    

两点转换规则

  1. 整数直接量可以直接赋值给byte、short、char,但是不能超出范围

    byte b1 = 5;
    short b2 = 6;
    btye b3 = 800;//编译错误,800超出byte的范围了
    
  2. byte、short、char型数据参与运算时先一律转换为 int 后再进行运算

    byte b4 = 5;
    byte b5 = 6;
    
    byte b6 = b4+ b5; // 编译错误,不能把两个byte相加
    byte b6 = (byte) (b4+ b5); //强转为byte则可以通过
    System.out.println(b6);
    
    int b7 = b4+ b5; //  自动类型转换,byte自动转换为int,所以用int接收
    System.out.println(b7);
    

练习:

System.out.println(2+2);//4
System.out.println(2+'2');//52,2加上'2'的ASCII码50
System.out.println('2'+'2');//100,'2'的ASCII码50加上'2'的ASCII码50
System.out.println('2');//2

解释:

  1. 普通整数相加
  2. 整数与字符相加,Java会自动将字符转换为其对应的ASCII码,运算随着转换为整数与ASCII码相加
  3. 两个字符无法直接进行运算,字符之间的运算需要转换成ASCII码之间的运算
  4. 普通输出字符
  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值