为何float的两种字符串格式结果不等,N9格式为何出现差异值?
C# float格式化差异问题解答
先看你给出的代码:
float flt = 0.123F; string s1 = flt.ToString("0.#########"); // "0.123" string s2 = flt.ToString("N9"); // "0.123000003"
1. 两种格式为何不等效?
- 自定义格式
0.#########的核心是只保留有实际意义的数字:小数点后的#占位符只会显示对应位置存在的有效数字,末尾因浮点精度产生的无意义误差位会被直接截断。所以格式化时,后面的微小误差位都被忽略了,最终只显示到0.123。 - 标准格式
N9的规则是强制保留9位小数:不管末尾是不是有效数字,都会按照变量实际存储的浮点值进行计算,补全到9位小数。它不会自动过滤精度误差带来的尾数位,所以会把那些微小的差异展示出来。
2. 为什么标准格式会出现000003后缀?
这是float(单精度浮点数)的天生特性导致的:
- 十进制的
0.123无法被二进制浮点数精确表示,flt变量实际存储的是一个极其接近0.123的近似值(具体值大概是0.123000003814697265625)。 - 调试器显示的
0.123是简化后的结果——调试器会自动把数值四舍五入到方便阅读的位数,并非变量真实存储的精确值。 - 当用
N9强制要求显示9位小数时,这个近似值的微小误差就被放大显示出来,于是就出现了0.123000003。
内容的提问来源于stack exchange,提问作者rory.ap
相关产品推荐
相关产品推荐

