long赋值给float会有问题吗?

比如:

long l1 = 4294967297; //二进制为1 00000000 00000000 00000000 00000001
float f1 = l1;
var str1 = ToBinString(BitConverter.GetBytes(f1));
long l2 = (long)f1;
Console.WriteLine($"str1:{str1}, l2:{l2}"); //str1:01001111 10000000 00000000 00000000, l2:4294967296

 

 

转为float的二进制过程中的相关步骤:

4) 转为科学计数法:

  1.0000000 00000000 00000000 00000000 1*(232),最后的9个bit 00000000 1超出了23bit会做舍入处理后截掉

5) 最终二进制:

  0(1001 1111)(0000000 00000000 00000000)

6) 再转为十进制:

  1.0000000 00000000 00000000*(232) >>> 小数点右移32位 >>> 1 00000000 00000000 00000000 00000000 = 4294967296

跟原来的值差了1

 

posted @ 2024-12-10 23:19  yanghui01  阅读(33)  评论(0)    收藏  举报