c语言中的浮点数用于表示带有小数部分的数值,主要分为float(单精度浮点数)和double(双精度浮点数)两种类型,浮点数的计算包含基础的加减乘除运算,也涉及类型转换、精度控制等相关内容。

c语言浮点数的基本定义
在c语言中,浮点数的两种常用类型有不同的存储大小和精度范围,具体对比如下:
| 类型 | 存储大小 | 精度范围 | 格式说明符 |
|---|---|---|---|
| float | 4字节 | 约6-7位有效数字 | %f |
| double | 8字节 | 约15-16位有效数字 | %lf |
定义浮点数变量的语法如下:
#include <stdio.h>
int main() {
float f_num = 3.14f; // 定义单精度浮点数,加f后缀避免被当作double
double d_num = 3.1415926; // 定义双精度浮点数
printf("float类型数值: %fn", f_num);
printf("double类型数值: %lfn", d_num);
return 0;
}
c语言浮点数的基础运算
浮点数的基础运算和整数运算逻辑一致,支持加、减、乘、除四种操作,运算结果会根据参与运算的变量类型自动适配。
加减乘除运算示例
以下是浮点数基础运算的完整代码示例:
#include <stdio.h>
int main() {
double a = 10.5;
double b = 3.2;
// 加法运算
double sum = a + b;
// 减法运算
double diff = a - b;
// 乘法运算
double product = a * b;
// 除法运算
double quotient = a / b;
printf("a + b = %lfn", sum);
printf("a - b = %lfn", diff);
printf("a * b = %lfn", product);
printf("a / b = %lfn", quotient);
return 0;
}
混合类型运算
当浮点数和整数混合运算时,整数会被自动转换为浮点数后再参与计算,结果类型为浮点数:
#include <stdio.h>
int main() {
int int_num = 5;
double double_num = 2.5;
// 整数和浮点数运算,整数自动转为浮点数
double result = int_num + double_num;
printf("整数和浮点数运算结果: %lfn", result); // 输出7.500000
return 0;
}
浮点数运算的注意事项
精度丢失问题
浮点数在计算机中是以二进制存储的,部分十进制小数无法精确转换为二进制,会导致运算结果出现精度偏差:
#include <stdio.h>
int main() {
double num1 = 0.1;
double num2 = 0.2;
double sum = num1 + num2;
// 预期结果是0.3,但实际输出会有精度偏差
printf("0.1 + 0.2 = %.20lfn", sum);
return 0;
}
如果需要比较浮点数是否相等,不能直接用==判断,应该判断两者的差值是否小于一个极小的阈值:
#include <stdio.h>
#include <math.h> // 需要引入math库使用fabs函数
int main() {
double a = 0.1 + 0.2;
double b = 0.3;
double epsilon = 1e-9; // 极小阈值
if (fabs(a - b) < epsilon) {
printf("两个浮点数相等n");
} else {
printf("两个浮点数不相等n");
}
return 0;
}
类型转换规则
当float和double类型混合运算时,float会被自动转换为double类型,运算结果为double类型。如果需要将double转为float,需要进行强制类型转换,但可能会丢失精度:
#include <stdio.h>
int main() {
double d = 3.1415926;
// 强制将double转换为float,会丢失部分精度
float f = (float)d;
printf("转换后的float数值: %fn", f);
return 0;
}
常见运算场景示例
计算圆的面积和周长是浮点数运算的常见场景,以下是对应实现代码:
#include <stdio.h>
#define PI 3.1415926 // 定义圆周率常量
int main() {
double radius;
printf("请输入圆的半径: ");
scanf("%lf", &radius);
double area = PI * radius * radius; // 面积计算
double circumference = 2 * PI * radius; // 周长计算
printf("圆的面积为: %lfn", area);
printf("圆的周长为: %lfn", circumference);
return 0;
}