浮点型(Floating Point Number)
浮点型包括float和double类型,java语言默认的是double类型,浮点型说直接一点就是用来表示小数的,带有小数点的!
类型 | 占用空间 | 范围 |
float | 4个字节 | - 3.403E38 ~ 3.403E38 |
double | 8个字节 | -1.798E308 ~ 1.798E308 |
老李说明:
上述表格中范围 3.403E38指的是科学计数法,E38指的是10的38次幂(次方),即3.403乘10的38次方。
java浮点类型常量的表示形式
(1) 十进制数的形式,例如: 0.314 3.14 314.0
(2) 科学计数法的形式,例如: 3.14e0(3.14乘10的0次幂) 3.14E2(3.14乘10的平方) 3.14E-2(3.14乘10的负2次方)
代码示例
double d1 = 314E4; // 表示:314 × 10 ^ 4(10的四次方)----> 3140000.0
double d2 = 314e-3; // 表示:314 × 10 ^ (-3) ----> 0.314
浮点型的说明
1. float类型又被称作单精度类型,可以精确到7位有效数字。
2. double类型又被称作双精度类型,数值精度约是float类型的2倍。
3. 浮点常量默认的类型是double类型,绝大多数的应用程序都采用double类型。想要使用float类型需要在后面加上F或者f。
4. 浮点型是不精确的,不要用于比较!
浮点型是存在舍入误差的,具体的浮点数字是不能够精确表示的!对于普通的科学工程计算,浮点型的精度是足够的。但是对于精度要求非常高的商业计算,需要使用BigDecimal来计算比较!
代码示例
/**
* float类型常量的写法以及变量的声明
* java语言默认的浮点型是double
* 想要使用float类型的数值时需要在后面加上一个F/f,如果不加只是声明float,则默认仍然时double
*/
float f = 3.14F; // 想要float类型赋值时需要在后面加F/f
// 可以在浮点数值的后面添加D/d,来清楚知道是double类型,初学者这样做可以时刻提醒自己!
double d1 = 3.14;
double d2 = 3.14D; // 提示自己是double类型
/**
* 浮点型数据的比较,比较不精确
*/
// 比较一
float f1 = 0.01F;
double d3 = 1.0 / 100; // "/" 代表计算机中的除号
System.out.println(f1 == d3); // 比较f1和d3的数值是否相等 结果:false 不相等
// 比较二
float f2 = 123456789f;
float f3 = f2 + 1;
// 判断语句if-else(如果怎样...否则...),后续会给大家讲条件语句的!
if(f2 == f3){
System.out.println("f2 == f3"); // 输出的结果是f2 == f3
}else{
System.out.println("f2 != f3"); // "!=" 表示不等于
}
在运行上面代码,浮点型数据比较的时候,比较一的示例中,逻辑上0.01和 1.0/100 = 0.01的数值是相等的,但是代码实际运行的时候,这两者是不相等的!因为浮点数一般都存在舍入误差,大多数数字都无法精确的表示,例如,0.1,0.01等。它的结果只是无限的接近,但是并不等于!所以不是所有的小数都可以精确的用二进制浮点数表示。比较二的示例中,逻辑上123456789和123456789 + 1 是不相等的,但是实际代码运行的时候,输出结果却是相等的。因为浮点数的精确表示是有限的,所以超过一定范围就会失效!
精确比较的类
java.math 包下面有两个可以精确比较的类:BigInteger和BigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。那另一个BigDecimal就是实现了任意精度的浮点数运算!
这里我为大家查找一下官当文档!当然我个人还是会使用里面的具体方法,只是为大家展示一下,这个类下面都有什么方法,可以帮助大家快速学会方法并且实现代码!
1. 遇到某个包下面不会使用的方法的时候,可以阅读文档,这里以BigInteger为例。
2. 向下翻,查找每个方法的使用和使用说明,举两个大家比较熟悉的方法:绝对值和除法
3. 熟悉代码的语法后,我们就可以自己动手编写代码了!这里我暂时不给大家演示了,像类以及对象,方法等后续为大家讲解清楚后再演示给大家。这样更加清晰!
易犯错误
一定不要使用浮点数进行比较!切记!切记!切记!很多freshman理论还没有弄清楚再或者是有工作经验的程序员都爱犯这个错误,当然我也是犯过这个错误的,所以提醒大家下。想要实现精度比较请大家使用BigInteger和BigDecimal类!