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博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端