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
基本类型转换
自动(隐式)类型转换
从小类型到大类型
基本数据类型从小到大依次为:
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,丢失精度
两点转换规则
-
整数直接量可以直接赋值给byte、short、char,但是不能超出范围
byte b1 = 5; short b2 = 6; btye b3 = 800;//编译错误,800超出byte的范围了
-
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
解释:
- 普通整数相加
- 整数与字符相加,Java会自动将字符转换为其对应的ASCII码,运算随着转换为整数与ASCII码相加
- 两个字符无法直接进行运算,字符之间的运算需要转换成ASCII码之间的运算
- 普通输出字符