1、 基本区别
float
和 double
都是用于表示浮点数的数据类型,但它们在精度(precision)和内存大小(storage size)上有显著区别。
属性 | float | double |
字节大小 | 4 bytes(32 位) | 8 bytes(64 位) |
精度 | 约 6~7 位十进制数字 | 约 15~16 位十进制数字 |
表示范围 | ±3.4×10⁻³⁸ ~ ±3.4×10³⁸ | ±1.7×10⁻³⁰⁸ ~ ±1.7×10³⁰⁸ |
默认类型 | 否(需要加 | 是(默认浮点字面值) |
2、精度损失问题
差异在进行数值计算时会导致精度损失(loss of precision)问题,特别是在比较两个浮点数是否相等时。
#include <iostream> #include <iomanip> using namespace std; int main() { float f = 1.0f / 3.0f; double d = 1.0 / 3.0; cout << fixed << setprecision(10); cout << "float: " << f << endl; cout << "double: " << d << endl; return 0; }
3、浮点数比较问题
由于浮点数存在精度误差,不能直接使用 ==
比较浮点数是否相等,应使用一个 容差值(epsilon)。
#include <cmath> // fabs #include <iostream> using namespace std; bool isEqual(double a, double b, double epsilon = 1e-9) { return fabs(a - b) < epsilon; } int main() { double x = 0.1 + 0.2; double y = 0.3; cout << boolalpha << isEqual(x, y) << endl; // 输出: true }
4、epsilon 的含义
epsilon 表示一个允许的误差范围,用于容忍计算中由于精度问题引起的细微差异。一般来说,float
类型使用 1e-5 ~ 1e-6 的 epsilon,double
类型使用 1e-9 ~ 1e-10 的 epsilon。
#include <iostream> #include <cmath> bool isAlmostEqual(double a, double b, double epsilon = 1e-9) { return std::fabs(a - b) < epsilon; } int main() { double x = 0.1 + 0.2; double y = 0.3; if (isAlmostEqual(x, y)) { std::cout << "x 和 y 近似相等" << std::endl; } else { std::cout << "x 和 y 不相等" << std::endl; } }