You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用double而非float时,0.1的相等判断输出与float不同?

为什么double类型的0.1判断会和float的情况不同?

代码示例:float x = 0.1; if (x == 0.1) printf("Equal"); else printf("Not-Equal");。已知float会截断二进制表示的部分位,double同样存在该情况。尽管double类型的0.1精度高于float,但仍无法精确等于0.1,且实际值略小于0.1。既然float类型的0.1判断输出为“Not-Equal”,为何double类型的0.1判断输出却并非如此?

这事儿的核心关键点其实很简单:C语言里的字面量0.1默认是double类型,咱们一步步拆解来看:

先看float的情况

当你写float x = 0.1;时,实际发生的是:

  1. 编译器先把十进制的0.1转换成double类型的近似值(这个值确实略小于十进制0.1,因为二进制无法精确表示它);
  2. 再把这个double近似值转成float类型——这个转换会进一步截断二进制位,丢失精度,得到的float版0.1和原来的double版0.1已经是两个不同的数值了。

后面的x == 0.1比较,是把float类型的x隐式转换回double类型,但这个转换只能把float的24位精度扩展成double的53位,补的都是0,根本恢复不了之前丢失的精度。所以此时比较的是「精度丢失后的float转double值」和「原始的double版0.1」,两者自然不相等,输出"Not-Equal"。

再看double的情况

如果是double x = 0.1; if (x == 0.1):
这里的字面量0.1本身就是double类型的近似值,直接赋值给double变量x时,没有任何精度丢失的转换——x和右侧的字面量是同一个二进制近似值。所以两者比较的结果就是相等,输出"Equal"。

补充一句

你说得没错,double的0.1确实也不是精确的十进制0.1,但这里的比较从来不是和「真正的十进制0.1」比——计算机里根本不存在能精确表示十进制0.1的二进制浮点数。我们比较的只是同一个近似值的两个副本,自然会相等。

打个生活化的比方:假设你有一篇无限长的文章,double是截取前53字的版本,float是截取前24字的版本。把53字的版本缩成24字再扩回53字,得到的肯定和原来的53字版本不一样;但直接拿53字的版本复制一份,那两份肯定完全相同。

内容的提问来源于stack exchange,提问作者Mrunal Vaidhya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:27:33