为何float变量存储0.7后与0.7不相等?0.5却相等?
浮点数比较的常见问题解析
为什么0.7与0.7比较结果不相等?
- C语言里,直接写的
0.7默认是double类型(双精度浮点数),而代码中的x是float类型(单精度浮点数)。 - 0.7这个十进制数无法用二进制浮点数精确表示,float和double的存储精度有差异:float仅保留23位有效尾数,double则有52位。把
0.7赋值给float变量x时,会被转换成float能容纳的近似值;而if判断里的0.7是double类型的近似值,这个值比float版本的0.7更精确,两者存储的二进制值并不相同,所以x == 0.7的结果为假,输出B。
为什么x改为0.5时输出变为A?
- 0.5是2的负一次方(
1/2),这类数可以用二进制浮点数精确表示。 - 不管是float还是double类型,存储0.5时的二进制值完全一致,没有精度损失。所以当
x是float类型的0.5,和double类型的0.5比较时,两者实际值完全相等,x == 0.5结果为真,输出A。
开发提示
实际写代码时,永远不要直接用==比较两个浮点数是否相等,应该通过判断两者的差值是否小于一个极小的阈值(比如1e-6)来判断近似相等,示例代码:
#include <stdio.h> #include <math.h> int main() { const float x = 0.7; if (fabs(x - 0.7) < 1e-6) { puts("A"); } else { puts("B"); } }
内容的提问来源于stack exchange,提问作者Tiyasa Mandal_CSE
相关产品推荐
相关产品推荐

