一、浮点数

float   double

Java中double大于等于 java double float_java

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

Java中double大于等于 java double float_开发语言_02

起名字:

Java中double大于等于 java double float_System_03

(1)float

单精度浮点数。

按照6~7位来记忆。

这样写是会报错的。

Java中double大于等于 java double float_Java中double大于等于_04

在后面加一个F就不会啦,如下图:

Java中double大于等于 java double float_Java中double大于等于_05

我们将这个变量 f 打印出来:

Java中double大于等于 java double float_Java中double大于等于_06

 打印结果:

Java中double大于等于 java double float_System_07

 Q1:float单精度浮点数,小数点后保留7位有效数字,但是下面这个明显不是啊?

Java中double大于等于 java double float_System_08

 Q2:如下图打印出来,怎么还变短了?

Java中double大于等于 java double float_System_09

这就要说到浮点数的存储机制了。

浮点数在内存上也是以1/0的方式存储,但1/0用来计算整数还好算,可用来计算浮点数就没有那么好算了。有一部分表示整数位,一部分表示小数位……

Java中double大于等于 java double float_开发语言_10

我们可以看到,浮点运算不太好算。

每次都会有偏差。

但我们可以暂时这样记,整体(包括小数点)是7位。这7位若全用来表示小数,就是7位小数。要是有的表示整数,那么小数位就会受到影响。 

(2)double

双精度浮点数

也是Java中默认存储浮点数的格式。

按照15位来记忆。

Java中double大于等于 java double float_java_11

我们在使用浮点数的时候,暂时别纠结精度这个事。

小数位数在算的过程中差一点就算了。没有关系。

若后缀为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

我们也可以来试一下,其实实际编写代码的时候,很少会写这种东西:

Java中double大于等于 java double float_浮点数_12

二、布尔型

Boolean

只有两个字面值常量   true  false

Java中double大于等于 java double float_java_13

三、字符型 

char  2B(字节)  16b(比特)  单个字符

java使用unicode字符集 对于java来说,世界各国的语言文字都是字母

Java中double大于等于 java double float_Java中double大于等于_14

 

java中的转义字符

    有些特殊的字符在java中无法正常使用或展示,因为有特殊的作用。

    使用 \ + 要转义的字符

   (1) \'

   (2)\"

   (3)\\

   (4)\t 制表符 一个制表符位8个空格 一个字母1个空格 一个汉字是2个空格

           如果前面的内容是制表符位的整数倍,当前制表符为重开一个,如果不够,补全一整个制表符位

   (5)\n 换行

   (6)\r 光标回到行首

   (7)\b 退格

 

Java中double大于等于 java double float_System_15

 

转义字符写法上虽然是多个符号,但是存储上认为是单个字符! 

我们可以在Idea上来看看转义字符的效果: 

Java中double大于等于 java double float_System_16

代码:

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

一堆文字串成的串

先记着,时候会详细讲。

Java中double大于等于 java double float_Java中double大于等于_17

四、数据类型的转换 

(1)从小到大

正常转换 不会损失数据 

byte >>> short >>> int >>> long >>> float >>>double

Java中double大于等于 java double float_java_18

 

我们可以来分析一下:

byte b=10; --->10在内存上存储的时候,占了8个比特位,即:0000 1010

short s=b; --->short在内存上占两个字节,16比特位,即:0000 0000 0000 1010

以此类推。

我们还会发现,字符型可以向整型转换 :

Java中double大于等于 java double float_浮点数_19

 我们来分析一下:

char c='a'; -->b >>> unicode >>> 00000000 10101010

int x=c; -->00000000 00000000 00000000 10101010>>>十进制

注意:char字符型可以和整型进行转换,而布尔型的不可以哦。

Java中double大于等于 java double float_Java中double大于等于_20

 

 (2)从大到小

从大到小 强制转换 可能会损失数据

double>>> float>>> long>>> int>>> short>>> byte

例一

如图,这样直接写会报错的。

Java中double大于等于 java double float_java_21

 short s=10; ---> 内存上这样存储的:00000000 00001010

byte b=s;     --->  b在内存上八位存储,而s是十六位存储。

小盒子只能存储大盒子中的一部分数据!

我们可以将s变量最后八位赋给b变量。需要强制取出。

Java中double大于等于 java double float_System_22

 上面的例子中,s二进制00000000 00001010

将s强制转换成byte的8个比特的时候,前面全是零,所以没有什么影响,转换之后是00001010,也就是10,看起来最终结果没有改变,但实际上前面八个0是被砍掉了。

例二

那我们来看下一个例子:

Java中double大于等于 java double float_java_23

 

 


300存储的时候,后面八位可能不够,前面的0中可能有的会变成1。当强制类型转换的时候,还是后面八位转换,前面八位就没有在转换。也就是说,会造成前面八位的数据损失!只会让后面八位转换成一个整数。


我们不妨来验证一下:

Java中double大于等于 java double float_浮点数_24

300的二进制:00000001 00101100  

将300转化为byte类型时:保留后八位 00101100

再转化为十进制:

Java中double大于等于 java double float_开发语言_25

从大到小转化的时候,为了尽量避免数据损失,应该让大的变量的值在小的变量范围之内。 

例三

Java中double大于等于 java double float_开发语言_26

分析:


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 之间转换

这样直接写后报错:

Java中double大于等于 java double float_System_27

 我们强制转换一下看看:

Java中double大于等于 java double float_System_28

 

 例五

浮点数和整数之间

这样直接写会报错。double和long在内存上,都是使用64比特,但在存储机制上有差别,double还需要消耗一部分比特位用于存储浮点数,而long只用于存储整数。所以double往long里面装的时候,就会装不下。装不下,就要用强制转换。

Java中double大于等于 java double float_浮点数_29

 

 当浮点数转换成整数的时候,可以简单的认为,就是把小数位砍掉了,把整数位赋值给变量了。但是实际上,底层会复杂一点。我们在这里说的是宏观看到的效果。

Java中double大于等于 java double float_Java中double大于等于_30

 

(3)小练习


//除法两端如果是整数,那么结果只保留整数部分


//除法两端任意一端是浮点数,那么结果就以浮点数保存,默认以double存储


Java中double大于等于 java double float_System_31

 

题目:给定任意一个浮点数,要求输出两位小数,考虑四舍五入。

分析:

<1> 保留两位小数

既然是输出两位小数,那就要把两位之后的给搞掉。可以通过强制转换,将小数位搞掉。但强制转换,会把所有小数位都搞掉,那怎么办?

我们可以让这个数先乘以100,再强制转换成int类型。我们知道,浮点数转换成整数,相当于把小数位抹掉了。再将这个数保留下来,除以100.0,输出即可。(不可以除100,要不然就没有小数位了)

Java中double大于等于 java double float_浮点数_32

 <2> 四舍五入

以此题为案例,我们要保留两位小数,且要四舍五入。

四舍五入,我们需要看3.14之后的那个数是否超过了5,若超过,就进一。

我们可以在v2之后加上0.5,若第三位小数超过5,则在加了0.5之后,会进一。

Java中double大于等于 java double float_System_33

 看一下结果:

Java中double大于等于 java double float_Java中double大于等于_34

代码:

//给定任意一个浮点数
        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

Java中double大于等于 java double float_System_35