表2-5浮点型数据类型 |
||
类型 |
占用存储空间 |
表数范围 |
float |
4字节 |
-3.403E38~3.403E38 |
double |
8字节 |
-1.798E308~1.798E308 |
Java浮点类型常量有两种表示形式
-
十进制数形式,例如:3.14 314.0 0.314
-
科学记数法形式,如314e2 314E2 314E-2
e2=10的2次方 31400 31400 3.14
示例2-11】使用科学记数法给浮点型变量赋值
1 2 |
double f = 314e2; //314*10^2-->31400.0
double f2 = 314e-2; //314*10^(-2)-->3.14
|
float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。
【示例2-12】float类型赋值时需要添加后缀F/f
1 2 3 |
float f = 3.14F;
double d1 = 3.14;
double d2 = 3.14D;
|
老鸟建议
-
浮点类型float,double的数据不适合在不容许舍入误差的金融计算领域。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
示例2-13】浮点数的比较一
1 2 3 |
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d);//结果为false
|
【示例2-14】浮点数的比较二
1 2 3 4 5 6 7 |
float d1 = 423432423f;
float d2 = d1+1;
if(d1==d2){
System.out.println("d1==d2");//输出结果为d1==d2
}else{
System.out.println("d1!=d2");
}
|
java.math包下面的两个有用的类:BigInteger和BigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。
菜鸟雷区
1.不要使用浮点数进行比较!很多新人甚至很多理论不扎实的有工作经验的程序员也会犯这个错误!需要比较请使用BigDecimal类
【示例2-15】使用BigDecimal进行浮点数的比较
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
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
}
}
|