3.26Java浮点型(floatingpoint)常量、变量

3.26Java浮点型(floating-point)常量、变量

本章内容

  • 浮点型变量

  • 浮点型常量


浮点型数据

  • float

  • double

float

特点:

  1. 单精度类型

  2. 占用4个字节

  3. 尾数可以精确到7位有效数字

  4. float类型数值要加'f'or'F'后缀

double

特点:

  1. 双精度型

  2. 占用8个字节

  3. 数值精度约是float类型的两倍

  4. 绝大部分应用程序都采用double类型

  5. 浮点型常量默认类型也是double

  6. 也可以在浮点数值后面加'D'or'd'明确其为double类型

Java浮点型常量的两种表示形式
  • 十进制数形式。如:3.14 314.0 0.314

  • 科学计数法形式。如:314e2(e2相当于10^2) 314E2 314E-2(10^-2)

浮点数的重要特性:不精确,没法精确。因为区间内小数是无限的

实例:

/**
* TestFloating-pointType
* @author Lucifer
*/
public class TestPrimitiveData_TypeNo2 {
   public static void main(String arguments[]){
       float first = 3.14F;
       System.out.println(first);
       double second = 6.28;
       double third = 628E-2;
       System.out.println(second);
       System.out.println(third);

       /*
       0.1f从数学上算应该是=1/10的,但是结果是false。说明不精确
       浮点数是不精确的,一定不要用于比较!
        */
       float f = 0.1f;
       double d = 1.0/10;
       double c = 1/10;
       System.out.println(f==d); //结果为false。'=='是比较符号
       System.out.println(f==c); //结果为false
       
               float d1 = 423432423f;
       float d2 = d1 + 1;
       if(d1==d2){
           System.out.println("d1==d2"); //输出结果为d1==d2
      }else{
           System.out.println("d1!=d2");
      }
  }
}

特点:

上面的语句实际上d1是!=d2的但是却输出d1==d2
其原因是:
字长有限,浮点数能够表示的数也是有限的,所以数是离散的。
浮点数一般都存在舍入误差,很多数字无法精确表示(如:0.1),其结果只能是接近,但不等于。
二进制浮点数不能精确的表示0.1、0.01、0.001这样的10的负次幂数。
不是所有的小数都能可以精确到二进制浮点数表示
所以千万不要用浮点数进行比较
如何比较浮点数的大小?

比较方法:

如果想比较两个类用Java.math包下面的两个类:

  • BigInteger

  • BigDecimal

这两个类可以处理任意长度的数值。

BigInteger:

实现了任意精度的整数运算

BigDecimal:

实现了任意精度的浮点运算

金融领域里面计算常用

实例:

public class TestPrimitiveDate_TypeNo2{
   public static void main(String arguments[]){
               /*
       使用精确的浮点运行,推荐使用:BigDecimal
        */
       System.out.println("##########");
       BigDecimal bd = BigDecimal.valueOf(1.0);
       bd = bd.subtract(BigDecimal.valueOf(0.1));
       bd = bd.subtract(BigDecimal.valueOf(0.1));
       bd = bd.subtract(BigDecimal.valueOf(0.1));
       bd = bd.subtract(BigDecimal.valueOf(0.1));
       bd = bd.subtract(BigDecimal.valueOf(0.1));
       System.out.println(bd); //0.5
       System.out.println(1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1); //0.5000000000000001

       BigDecimal bd2 = BigDecimal.valueOf(0.1);
       BigDecimal bd3 = BigDecimal.valueOf(1.0/10.0);

       System.out.println(bd2.equals(bd3));
       System.out.println(bd2 == bd3);
       
  }
}
/*
这里面涉及到了equals和'=='的区别
因为同一的对象不同的打印方法的得到的结果不一样
*/

char:

用单引号引用就是char类型是Unicode编码

String:

  • 用双引号表示就是String类型

  • String是一个字符的序列,本质是字符的数组

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/14584954.html