浮点数分为单精度和双精度, Java中的单精度和双精度区分为float和double. 你们知道float和double是怎样存储的吗?
float占4个字节, double占8个字节, 为了方便起见, 这里就只讨论float类型.
float其实和一个int型的大小是一样的, 一共32位, 第一位表示符号, 2-9表示指数, 后面23位表示小数部分. 这里不多说, 请参考:blog. csdn/treeroot/archive/2004/09/05/95071. aspx
这里只举一个例子, 希望能抛砖引玉, 就是研讨一下浮点数0. 1的存储方式, 先运行这个顺序.
public class Test{
public static void main(String[] args) {
int x = 0x3d800000;
int i = 1 22;
int j = 1 4;
float f = 0. 1f;
int y = Float. floatToIntBits(f);
float rest = f - ( (float) 1) / j;
while (i 0) {
j = 1;
float deta = ( (float) 1) / j;
if (rest = deta) {
rest -= deta;
x |= i;
}
i = 1;
}
pr(x);
pr(y);
}
static void pr(int i) {
System. out. println(Integer. toBinaryString(i));
}
}
结果:
111101110011001100110011001101
111101110011001100110011001101
顺序说明:
int x=0x3d80000;
由于浮点表示方式为1. f*2n-127我们要表示0. 1, 可以知道n-127=-4, 到n=123
符号为正, 可知前9是 001111011, 暂时不考虑后面的23位小数, 所以我们先假设x=0x3d800000;
int i = 1 22;
i初始为第右起第23位为1, 就是x的第10位
int j = 1 4;
i初始为4, 由于n-127为-4, 这里是为了求它的倒数.
float f = 0. 1f;
int y = Float. floatToIntBits(f);
y就是它的32位表示
float rest = f - ( (float) 1) / j;
这个rest表示除了1. f中的1剩下的, 也就是0. f
while (i 0) {
j = 1;
float deta = ( (float) 1) / j;
if (rest = deta) {
rest -= deta;
x |= i;
}
i = 1;
}
这个循环来计算23位小数部分, 如果rest不小于deta, 表示这个位可以置为1.
其他的不多说了,
faceshop 输入结果是一样的, 可以说0. 1这个浮点数肯定是不精确的, 但是0. 5可以精确的表示, 想想为什么吧.