float有效位数

6位是绝对有效数字。第7位有时候准确,有时候不准确。

 

例1

float f1 = 1234560.991f;
Console.WriteLine($"{f1}");

执行上面的代码,会输出1234561,这个例子中就是第7位数字不准。

按float转二进制步骤分析下:

1) 整数部分的二进制为:

  10010110 10110100 00000,共21bit

2) 小数部分的二进制:

  11111101 10110010,这边是只取了16bit

3) 整数和小数部分拼接:

  10010110 10110100 00000.11111101 10110010

4) 转为科学计数法:

  1.00101101 01101000 0000111 11101101 10010*(220),最后13个bit超出了23bit会做舍入处理后截掉,(这边11101101 10010大于11111111 11111的一半,进1)

5) 得出最终二进制:

  S = 0, E = 1001 0011, M = 00101101 01101000 0000111 + 1 = 00101101 01101000 0001000

  最终结果:0(1001 0011)(00101101 01101000 0001000)

6) 再转为十进制:

  1.00101101 01101000 0001000*(220) = 100101101 01101000 0001.000 = 1234561

 

例2

float f1 = 123456789f;
Console.WriteLine($"{f1}");

执行上面的代码,会输出123456792,这个例子中就是第8位数字不准。

按float转二进制步骤分析下:

1) 整数部分的二进制为:

  11101011 01111001 10100010 101,共27bit

4) 转为科学计数法:

  1.1101011 01111001 10100010 101*(226),最后3个bit超出了23bit会做舍入处理后截掉,(这边101大于111的一半,进1)

5) 得出最终二进制:

  S = 0, E = 127 + 26 = 1001 1001, M = 1101011 01111001 10100010 + 1 = 1101011 01111001 10100011

  最终结果:0(1001 1001)(1101011 01111001 10100011)

6) 再转为十进制:

  1.1101011 01111001 10100011*(226) = 11101011 01111001 10100011 000 = 123456792

 

 

参考 

Float类型的有效位数有几位_浮点数的有效位数怎么确定-CSDN博客

C语言float的精度问题_单精度实数有效位算小数点吗-CSDN博客

为什么float精度只能是6位?_百度知道

 

posted @   yanghui01  阅读(223)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示