为何float赋值超精度数转double后能还原原数?
关于float转double后精度“恢复”的疑问与解答
问题代码与现象
float f = -1.8033077716827393f; Console.WriteLine("f=" + f); double d = (double)f; Console.WriteLine("d=" + d);
输出结果:
f=-1.8033078 d=-1.8033077716827393
疑问点
根据微软文档说明,float仅支持9位精度,将-1.8033077716827393存入float时,理论上额外精度应该丢失,但转为double后却能显示完整数值。实际场景中,读取标注为4字节实数(对应C#的float)的二进制数据时,Python工具显示值为-1.8033077716827393,C#中直接输出float显示为-1.8033078,转double后却恢复为原数值。
解答
这并不是“恢复”了丢失的精度,而是这个数值本身的特殊性导致的:
- 当你把
-1.8033077716827393f作为float字面量时,编译器会自动将其转换为最接近的可被float精确表示的二进制值。 - 这个float的二进制值,在转换为double时,因为double的精度远高于float,能够精确还原出该二进制值对应的十进制数——而这个十进制数刚好就是你最初写的
-1.8033077716827393。 - 至于C#中直接输出float显示为
-1.8033078,是因为float.ToString()默认只会输出足够区分不同float值的位数(通常是7到9位有效数字),它并没有显示float内部存储的完整精确值,只是做了简化输出。
内容的提问来源于stack exchange,提问作者A person
相关产品推荐
相关产品推荐

