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博客

浙公网安备 33010602011771号