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!!!