Java数据类型

Posted 幻影黑子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java数据类型相关的知识,希望对你有一定的参考价值。

Java是一种强类型语言,每个变量都必须声明其类型。

1) Java的数据类型分为两大类:基本类型和引用类型

整数型(byte,short,int,long

大家来看一个图:

 

1) 举例一个byte其它以此类推:
byte 是一个字节保存的,有8个位,即80、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具有从065535之间的编码,他们通常用从’\\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类型有两个值,truefalse,不可以 0 或非 0 的整数替代 true  false ,这点和C语言不同。

总结:

用单引号\'\'标识,只能放单个字符。

char+charchar+int——类型均提升为int,附值char变量后,输出字符编码表中对应的字符。

boolean类型一位,不是一个字节boolean类型有两个值,truefalse,不可以 0 或非 0 的整数替代 true  false ,这点和C语言不同。

boolean bool = true;//或者boolean bool = false;

boolean 类型用来判断逻辑条件,一般用于ifwhiledo whileboolean sex = false;

案例一

if(sex==true){System.out.println("你是男的");}

else{System.out.println("你是女的");}

案例二

while(sex){

  ...}

案例三

do{

}while(sex)

以上是关于Java数据类型的主要内容,如果未能解决你的问题,请参考以下文章

java中引用数据类型和基本数据类型的区别

java中的引用数据类型是啥意思?

JAVA都有哪些基本数据类型啊

JAVA的基本数据类型和引用数据类型的区别

java中的引用数据数据类型是怎样的?

java 数据类型