一、浮点数
float double
float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。而double表示这种类型的数值精度约是float类型的两倍(15位),又被称作双精度类型,绝大部分应用程序都采用double类型。
float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。
注意:
(1)浮点常量默认为double。要变为float,需在后面增加F/f. 如: 3.14F
(2)浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
我们创建一个类,来试一试:
咱们在上节Idea建立的demo1基础上再次新建一个类:Test2
起名字:
(1)float
单精度浮点数。
按照6~7位来记忆。
这样写是会报错的。
在后面加一个F就不会啦,如下图:
我们将这个变量 f 打印出来:
打印结果:
Q1:float单精度浮点数,小数点后保留7位有效数字,但是下面这个明显不是啊?
Q2:如下图打印出来,怎么还变短了?
这就要说到浮点数的存储机制了。
浮点数在内存上也是以1/0的方式存储,但1/0用来计算整数还好算,可用来计算浮点数就没有那么好算了。有一部分表示整数位,一部分表示小数位……
我们可以看到,浮点运算不太好算。
每次都会有偏差。
但我们可以暂时这样记,整体(包括小数点)是7位。这7位若全用来表示小数,就是7位小数。要是有的表示整数,那么小数位就会受到影响。
(2)double
双精度浮点数
也是Java中默认存储浮点数的格式。
按照15位来记忆。
我们在使用浮点数的时候,暂时别纠结精度这个事。
小数位数在算的过程中差一点就算了。没有关系。
若后缀为f或者F,就是告诉Java,以float存储一个数据。
(3)科学计数法
314e2 314E2 (E的大小写没有区分)
double f = 314e2; >>>314*10^2-->31400.0
double f2 = 314e-2; >>>314*10^(-2)-->3.14
我们也可以来试一下,其实实际编写代码的时候,很少会写这种东西:
二、布尔型
Boolean
只有两个字面值常量 true false
三、字符型
char 2B(字节) 16b(比特) 单个字符
java使用unicode字符集 对于java来说,世界各国的语言文字都是字母
java中的转义字符
有些特殊的字符在java中无法正常使用或展示,因为有特殊的作用。
使用 \ + 要转义的字符
(1) \'
(2)\"
(3)\\
(4)\t 制表符 一个制表符位8个空格 一个字母1个空格 一个汉字是2个空格
如果前面的内容是制表符位的整数倍,当前制表符为重开一个,如果不够,补全一整个制表符位
(5)\n 换行
(6)\r 光标回到行首
(7)\b 退格
转义字符写法上虽然是多个符号,但是存储上认为是单个字符!
我们可以在Idea上来看看转义字符的效果:
代码:
package demo1;
public class Test5 {
public static void main(String[] args) {
//char 只能存储一个字符,使用单引号包裹字符
char c='你';
System.out.println(c);
char d='h';
System.out.println(d);
//用char存储单引号,单引号有特殊含义,它是单个字符两端的边界符号
//单引号当做文字来使用的话,不能直接写,在前面写一个斜线就好啦。
char e='\'';
System.out.println(e);
char f='\\'; //这两个连这写,但是是一个字符哦
System.out.println(f);
char g='\t'; //横向跳格 对应键盘上的Tab 制表符 跳格8个字符
System.out.println("my"+g+"fashion");
char h='\b'; //往前删掉一个字符
System.out.println("my"+h+"fashion");
char i='\r'; //让光标回跳到最前,就感觉前面的“my”被删掉了
System.out.println("my"+i+"fashion");
char k='\n'; //换行转义字符
System.out.println("my"+k+"fashion");
}
}
字符串
String
一堆文字串成的串
先记着,时候会详细讲。
四、数据类型的转换
(1)从小到大
正常转换 不会损失数据
byte >>> short >>> int >>> long >>> float >>>double
我们可以来分析一下:
byte b=10; --->10在内存上存储的时候,占了8个比特位,即:0000 1010
short s=b; --->short在内存上占两个字节,16比特位,即:0000 0000 0000 1010
以此类推。
我们还会发现,字符型可以向整型转换 :
我们来分析一下:
char c='a'; -->b >>> unicode >>> 00000000 10101010
int x=c; -->00000000 00000000 00000000 10101010>>>十进制
注意:char字符型可以和整型进行转换,而布尔型的不可以哦。
(2)从大到小
从大到小 强制转换 可能会损失数据
double>>> float>>> long>>> int>>> short>>> byte
例一
如图,这样直接写会报错的。
short s=10; ---> 内存上这样存储的:00000000 00001010
byte b=s; ---> b在内存上八位存储,而s是十六位存储。
小盒子只能存储大盒子中的一部分数据!
我们可以将s变量最后八位赋给b变量。需要强制取出。
上面的例子中,s二进制00000000 00001010
将s强制转换成byte的8个比特的时候,前面全是零,所以没有什么影响,转换之后是00001010,也就是10,看起来最终结果没有改变,但实际上前面八个0是被砍掉了。
例二
那我们来看下一个例子:
300存储的时候,后面八位可能不够,前面的0中可能有的会变成1。当强制类型转换的时候,还是后面八位转换,前面八位就没有在转换。也就是说,会造成前面八位的数据损失!只会让后面八位转换成一个整数。
我们不妨来验证一下:
300的二进制:00000001 00101100
将300转化为byte类型时:保留后八位 00101100
再转化为十进制:
从大到小转化的时候,为了尽量避免数据损失,应该让大的变量的值在小的变量范围之内。
例三
分析:
int i=10; //int占用32比特,00000000 00000000 00000000 00001010 short j=(short)i; //short占用16比特,变量i转化为short之后,00000000 00001010 System.out.println(j); //因为损失的全是0,所以最终结果不变,还是10
例四
int 和 char 之间转换
这样直接写后报错:
我们强制转换一下看看:
例五
浮点数和整数之间
这样直接写会报错。double和long在内存上,都是使用64比特,但在存储机制上有差别,double还需要消耗一部分比特位用于存储浮点数,而long只用于存储整数。所以double往long里面装的时候,就会装不下。装不下,就要用强制转换。
当浮点数转换成整数的时候,可以简单的认为,就是把小数位砍掉了,把整数位赋值给变量了。但是实际上,底层会复杂一点。我们在这里说的是宏观看到的效果。
(3)小练习
//除法两端如果是整数,那么结果只保留整数部分
//除法两端任意一端是浮点数,那么结果就以浮点数保存,默认以double存储
题目:给定任意一个浮点数,要求输出两位小数,考虑四舍五入。
分析:
<1> 保留两位小数
既然是输出两位小数,那就要把两位之后的给搞掉。可以通过强制转换,将小数位搞掉。但强制转换,会把所有小数位都搞掉,那怎么办?
我们可以让这个数先乘以100,再强制转换成int类型。我们知道,浮点数转换成整数,相当于把小数位抹掉了。再将这个数保留下来,除以100.0,输出即可。(不可以除100,要不然就没有小数位了)
<2> 四舍五入
以此题为案例,我们要保留两位小数,且要四舍五入。
四舍五入,我们需要看3.14之后的那个数是否超过了5,若超过,就进一。
我们可以在v2之后加上0.5,若第三位小数超过5,则在加了0.5之后,会进一。
看一下结果:
代码:
//给定任意一个浮点数
double value=3.1415926;
//要求输出 保留两位小数 考虑四舍五入
double v2=value*100+0.5; //314.15+0.5=314.65
int v3=(int)v2; //314
System.out.println(v3/100.0); //3.14
同样,咱们可以试一下3.14675