类型 | 占用存储空间 | 表数范围 |
float | 4字节 | -3.403E38~3.403E38 |
double | 8字节 | -1.798E308~1.798E308 |
①float类型又被称作单精度类型,尾数可以精确到7位有效数字
②double表示这种类型的数值精度约是float类型的两倍,又被称作双精度类型,绝大部分应用程序都采用double类型。
③Java浮点型类型常量有两种表示形式
(1)十进制数形式:例:3.14 314.0 0.314
(2)科学记数法形式:例:3.14e0 3.14E2 3.14E-1
④浮点型不精确,不用于比较
浮点数存在舍入误差,数字不能精确表示。
浮点数适合普通的科学和工程计算,精度足够;但不适合精度要求非常高的商业计算,这个时候要使用BigDecimal进行运算和比较。
⑤浮点常量默认类型是double,要改成float可以后面加F和f。
eg.使用科学计数法給浮点型变量赋值
double f = 314e2; //314*10^2-->31400.0
double f2 = 314e-2; //314*10^(-2)-->3.14
float类型的数值有一个后缀F或者f,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d,以明确其为double类型。
eg1.float类型常量的写法及变量的声明
float f = 3.14F; //float类型赋值时需要添加后缀F/f
double d1 = 3.14;
double d2 = 3.14D;
eg2.浮点型数据的比较一
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d); //结果为false
eg3.浮点型数据比较二
float d1 = 423432423f;
float d2 = d1 + 1;
if(d1==d2){
System.out.println("d1==d2"); //输出结果为d1==d2
}else{
System.out.println("d1!=d2");
}
运行以上两个示例,发现示例1的结果是false,而示例2的输出结果是d1==d2。这是因为由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近,但不等于。二进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制的浮点数表示。
java.math包下面的两个有用的类:BigInteger和BigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。
Note:不要使用浮点数进行比较,需要比较要使用BigDecimal类。
字符型
ASCII字符集表示了英文字母、数字、特殊字符、控制符,所有字符集的老祖宗,大家都会兼容它。但是一个字节能够表示256个状态,而ASCII字符只用到128个,后面128个一直是空的。
于是有了ISO8859-1,别名latin-1,包含了256个字符。前128个字符与ASCII中完全相同。后128个包括了西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的字符号。
随着我国的计算机普及,汉字的处理也有了我们自己的方案,那就是GB2312,两个字节表示1个汉字,两个字节可以表示65536个状态,汉字再多也能包含全部。后来,又有了GBK,GB18030。
我国的台湾地区自己搞了一套显示繁体中文的大五码BIG5。
全世界各个地方,都有自己的文字编码,由于不互通,经常造成乱码的问题。
如果有一种统一的字符集,将世界上所有的语言字符都纳入其中,每一个字符都给予一个全球独一无二的编码,那么乱码问题就会消失,于是,全球所有国家和民族使用的所有语言字符的统一字符集诞生了,这就是Unicode字符集。
Unicode 字符集是为了给全世界所有字符集一个唯一的编码,"唯一"对应的英文为Unique,而编码的英文为code。
Unicode采用了字符集和编码分开的策略。Unicode诞生之前可以将字符集和字符编码混为一谈,而在Unicode中必须严格区分开。
Unicode字符集统一采用两个字节表示一个字符,包括英文字母。但是,由于英文占据互联网信息的绝大部分。真实存储和传输时,会造成极大的浪费;因此,目前主要采用UTF-8编码来实现具体的存储和传输。UTF-8是变长编码,用1-6个字节编码Unicode字符。西欧字符仍然是1个字节,汉字3个字节。
字符型在内存中占2个字节,在Java中使用单引号来表示字符常量。例如'A'
是一个字符,它与"A"
是不同的,"A"
表示含有一个字符的字符串。
char类型用来表示在Unicode编码表中的字符。Unicode
编码被设计用来处理各种语言的文字,它占2个字节,可允许有65536个字符。
字符型演示
char eChar = 'a';
char cChar = '中';
Unicode具有从0到65535之间的编码,他们通常用从' \u0000'到 ' \uFFFF'之间的十六进制值来表示(前缀为u表示Unicode)
字符型的十六进制值表示方法
char c = '\u0061';
Java语言中还允许使用转义字符 '\' 来将其后的字符转变为其它的含义。
常用的转义字符及其含义和Unicode值如下:
转义字符
char c2 = '\n'; //代表换行符
转义字符 | ||
转义符 | 含义 | Unicode |
\b | 退格(backspace) | \u0008 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\t | 制表符(tab) | \uooo9 |
\ " | 双引号 | \u0022 |
\ ' | 单引号 | \u0027 |
\ | 反斜杠 | \u005c |
Note:
String类,其实是字符系列(char sequence),本质是char字符组成的数组。