输出为:import java.math.BigDecimal;
/**
*
* @author zhangliang
*
* 2016年3月30日 下午5:58:39
*/
public class FloatTest {
public static void main(String[] args) {
float a = 2.0f -1.1f;
System.out.println(a);
double b = 2.0d -1.1d;
System.out.println(b);
double c = sub(2.0d,1.1d);
System.out.println(c);
float unit = Float.valueOf(1000);//取出换算单位1000.0
float svt = ((20000000f+1))/unit;//加0.001
System.out.println(String.valueOf(svt));//精度丢失
double unit1 = Float.valueOf(1000);//取出换算单位1000.0
double svt1 = ((20000000d+1))/unit1;//加0.001
System.out.println(String.valueOf(svt1));//ok
System.out.println(Long.toBinaryString( Double.doubleToLongBits(20000001d)));
System.out.println(Integer.toBinaryString(Float.floatToIntBits(20000001)));
System.out.println(Integer.toBinaryString(Float.floatToIntBits(16777215)));
System.out.println(Integer.toBinaryString(Float.floatToIntBits(16777216)));
System.out.println(Integer.toBinaryString(20000001));
float f = 20000001;
System.out.println(f);
double d =20000001;
System.out.println(d);
}
public static double sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
}

Java 语言支持两种基本的浮点类型: float 和 double 。java 的浮点类型都依据 IEEE 754 标准。IEEE 754 定义了32 位和 64 位双精度两种浮点二进制小数标准。
IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。32 位浮点数用 1 位表示数字的符号,用 8 位来表示指数,用 23 位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数 2 )小数来表示。对于64 位双精度浮点数,用 1 位表示数字的符号,用 11 位表示指数,52 位表示尾数。
无论是单精度还是双精度在存储中都分为三个部分:
- 符号位(sign bit):1为负数,0为正数
- 指数(exponent biasing):使用的是biased exponent, 也被称为移码。移码就是将数值加上某个偏移量(单精度是127,双精度是加上1023)。为什么用移码,wiki解释:使用二进制的补码来存储,不方便于比较。使用移码,负值变为正值[-126,127]变为[1,254],方便对阶。
- 尾数(小数):最高一位省略. 当1 < exponent < 2e ? 2,这个省略的一位是1,此时我们称之为规范化的数(Normalized numbers)。如果指数为0,小数部分不为0,这个省略的一位是0,我们称之为Denormalized numbers。当指数和小数部分都是0时,这个省略位也为0,根据符号位的不同,表示正负0。其他就(Infinities和NaNs)不作介绍。


其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^127,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1023,也即-1.79E+308 ~ +1.79E+308。