51,412
社区成员
发帖
与我相关
我的任务
分享
//1011000100110010110110.0100110011001100 2903222.29998779296875
//1011000100110010110110.0100111101011100 2903222.30999755859375
Float f1 = 2903222.3F;
Float f2 = 2903222.31F;
System.out.println(f1);
System.out.println(f2);
System.out.println(2903222.3F == 2903222.31F);


//1011000100110010110110.0100110011001100 2903222.29998779296875
//1011000100110010110110.0100111101011100 2903222.30999755859375
// 尝试转换成浮点数进行存储
// 1011000100110010110110.0100110011001100 ==> 1.0110001001100101101100100110011001100 x 2^10101
// 去掉整数部分的“1”和小数点“.”之后,尾数保留23位二进制数
// 尾数部分是 0110001 00110010 11011001
// 阶码是 00010101
// 浮点数存储结构是 00001010 10110001 00110010 11011001
// 我们可以发现,由于尾数的23bit限制,去掉了后面的一些数据。
// 1011000100110010110110.0100110011001100 ==> 1011000100110010110110.01 = 2903222.25
// 1011000100110010110110.0100111101011100 ==> 1011000100110010110110.01 = 2903222.25
// 很明显,2903222.25 ~ 2903222.375 之间的数值由于精度的原因,被丢弃了。
// 为啥是 .25~ .375 呢,因为 0.01(二进制)是0.25(十进制), 0.011(二进制)是0.375(十进制)
// 最后,为啥控制台输出的是 2903222.2 缺少最后一位的5呢?我也不清楚是个啥原因,现在有点晚了,脑子也转不动了,等以后有机会在琢磨吧。