Java是一种强类型语言,每个变量都必须声明其类型。
1) Java的数据类型分为两大类:基本类型和引用类型
整数型(byte,short,int,long)
大家来看一个图:
1) 举例一个byte其它以此类推:
byte 是一个字节保存的,有8个位,即8个0、1。
8 位的第一个位是符号位, 也就是说 0000 0001 代表的是数字1
1000 0000 代表的就是-1,所以正数最大位 0111 1111,也就是数字127
负数最大为 1111 1111,也就是数字-128,所以 Java 中的一个 byte 是 1 个字节,其范围是-128~127
2) Java 语言整型常数的三种表示形式:
十进制整数,如:100, -500, 0。
八进制整数,要求以 0 开头,如:011。
十六进制数,要求 0x 或 0X 开头,如:0x15 。
Java语言的整型常数默认为int型,声明long型常量可以后加‘ l ’或‘L ’ ,如:
long a = 10000000; //不出错,在Int表示的范围内(21亿内)。
long b = 10000000000;//必须要加10000000000L,要不然就会报错错误: 过大的整数: 10000000000
浮点型
float类型又被称作单精度类型,尾数可以精确到 7 位有效数字,在很多情况下,float 类型的精度很难满足需求。
double 表示这种类型的数值精度是 float 类型的两倍,又被称作双精度,绝大部分应用程序都采用 double 类型。
Java 浮点类型常量有两种表示形式
十进制数形式,例如:
3.14 314.0 0.314
科学记数法形式,如
314e2 314E2 314E-2
Float类型的数值有一个后缀F/f,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D/d, 以明确其为double类型。
浮点类型float, double的数据不适合在计算或者比较中使用,因为会丢失精度。如果需要精确数字计算,需要使用BigDecimal类。
主要理由:由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近, 但不等于。
BigDecimal类
java.math.BigDecimal
BigDecimal构造方法
1.public BigDecimal(double val) 将double表示形式转换为BigDecimal *不建议使用
2.public BigDecimal(int val)将int表示形式转换成BigDecimal
3.public BigDecimal(String val)将String表示形式转换成BigDecimal
为什么不建议采用第一种构造方法呢?来看例子
public static void main(String[] args)
{
BigDecimal bigDecimal = new BigDecimal(2);
BigDecimal bDouble = new BigDecimal(2.3);
BigDecimal bString = new BigDecimal("2.3");
System.out.println("bigDecimal=" + bigDecimal);
System.out.println("bDouble=" + bDouble);
System.out.println("bString=" + bString);
}
运行结果如下
为什么会出现这种情况呢?
JDK的描述:1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
2、另一方面,String 构造方法是完全可预知的:写入 newBigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。
当double必须用作BigDecimal的源时,请使用Double.toString(double)转成String,然后使用String构造方法,或使用BigDecimal的静态方法valueOf,如下
public static void main(String[] args)
{
BigDecimal bDouble1 = BigDecimal.valueOf(2.3);
BigDecimal bDouble2 = new BigDecimal(Double.toString(2.3));
System.out.println("bDouble1=" + bDouble1);
System.out.println("bDouble2=" + bDouble2);
}
结果如下
总结
(1)商业计算使用BigDecimal。
(2)尽量使用参数类型为String的构造函数。
(3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
(4)我们往往容易忽略JDK底层的一些实现细节,导致出现错误,需要多加注意。
Char类型
Char 是字符类型(单个字符)占2个字节16位。
单引号用来表示字符常量。例如‘A’是一个字符,它与“A”是不同的,“A”表示含有一个字符的字符串。
char 类型用来表示在 Unicode 编码表中的字符。
Unicode 编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536个字符;ASCII码占1个字节,可允许有128个字符,是Unicode编码表中前128个字符。例如:
char eChar = ‘a‘;
char cChar =‘中‘;
Unicode具有从0到65535之间的编码,他们通常用从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为u表示Unicode)
char c = ‘\u0061’;
Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义,
char c2 = ‘\n‘; //代表换行符
char运算
Char 类型是可以运算的因为 char 在 ASCII 等字符编码表中有对应的数值。
在 JAVA 中,对 char 类型字符运行时,直接当做 ASCII 表对应的整数来对待
char a = ‘a‘;
int b = 2;
int c = a+b;
System.out.println(c);//答案是99
Boolean类型
boolean类型一位,不是一个字节,boolean类型有两个值,true和false,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。
总结:
用单引号‘‘标识,只能放单个字符。
char+char,char+int——类型均提升为int,附值char变量后,输出字符编码表中对应的字符。
boolean类型一位,不是一个字节boolean类型有两个值,true和false,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。
boolean bool = true;//或者boolean bool = false;
boolean 类型用来判断逻辑条件,一般用于if、while、do while。boolean sex = false;
案例一
if(sex==true){System.out.println("你是男的");}
else{System.out.println("你是女的");}
案例二
while(sex){
...}
案例三
do{
}while(sex)