带小数的数据在Java中称为浮点型,浮点型可以分为float类型和double类型。
类型 | 占用存储空间 | 表数范围 |
float | 4字节 | -3.403E38~3.403E38 |
double | 8字节 | -1.798E308~1.798E308 |
float类型又被称为单精度类型,尾数可以精确到7位有效数字,在很多情况下float类型的精度很难满足需求。而double表示这种类型的数值约是float类型的两倍,又被称作双精度类型,绝大部分应用程序都采用double类型。浮点类型常量默认类型也是double。
Java浮点类型常量的两种表现形式
- 十进制数形式,例如:3.14 314.0 0.314
- 科学记数法形式,如:314e2 314E2 314E-2
上面的科学记数法形式,e2表示10的2次方,也就是314乘10的2次方。而E-2表示10的-2次方,即314乘10的-2次方。
使用科学记数法个浮点型变量赋值
double f1=314e2; //314*10^2 --> 31400.0
double f2=314e-2; //314*10^(-2) --> 3.14
float f3=3.3f;
float类型的数值有一个后缀F或者f,如果没有的话,则默认为double类型,也可以在浮点数值后面直接添加D或者d,以明确其为double类型。同时注意,为float类型数据赋值时,要加上后缀F或者f 。
浮点数不要用于比较
float a1=0.1f;
double a2=1.0/10;
System.out.println(a1==a2); //输出结果为false
float a1=0.1f;
double a2=1.0/10;
System.out.println(a1==a2); //输出结果为false
浮点数是不精确的,因此一点不要用于比较!
使用BigDecimal进行浮点数的比较
浮点类型float,double的数据不适合在不容许舍入误差的金融计算领域。如果需要进行不产生误差的精确数字计算,需要使用BigDecimal类。
在java.math包下面的两个有用的类:BigInteger和BigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点数运算。