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

为何将float改为double后,浮点数比较逻辑可正常运行?

为什么float类型无法匹配14.2,而double和整数可以?

核心原因:浮点数的二进制表示精度限制

整数(5、19)能正常匹配的原因

整数5、19属于有限二进制整数,可以被float和double类型精确存储。二进制能精准表示所有不超过类型取值范围的整数,因此存储后的值和代码里的字面量完全一致,直接用==比较不会出现偏差。

14.2在float下匹配失败的原因

14.2是十进制小数,转换成二进制时是无限循环的二进制小数:

  • float类型仅有24位有效二进制位(对应约7-8位十进制精度),存储14.2时必须截断或舍入这个无限循环的二进制数,最终存储的值和字面量14.2存在微小误差。
  • 代码中写的14.2默认是double类型,当float类型的tankSize和它比较时,会先被提升为double,但提升后的带误差值,和精确的double版14.2仍然不相等,导致if (tankSize == 14.2)条件不成立,无法进入对应分支。此时amount变量未初始化就被使用,最终出现异常。

double能正常工作的原因

double类型有53位有效二进制位(对应约15-17位十进制精度),虽然14.2转换成二进制也是无限循环,但double的精度足够高,存储的近似值和字面量14.2的误差极小。当输入14.2用double存储后,和代码里的double字面量14.2比较时,二者的误差小到可以通过==匹配(实际是输入的14.2转换成double后,和字面量的14.2几乎完全一致)。

代码的正确写法:避免直接比较浮点数

直接用==比较浮点数是错误的实践,因为浮点数几乎总会存在精度误差。正确的做法是判断两个浮点数的绝对值差是否小于一个极小的阈值(比如1e-6)。

修改示例(以case 'B'中的14.2判断为例,需先包含头文件<math.h>):

else if (fabs(tankSize - 14.2) < 1e-6)

这样不管是float还是double类型,都能正确匹配预期的数值,避免精度问题导致的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:40:49