大家好,我是林译川。今天我们来聊聊C++中那些让人头疼的float和double。它们在精度和输出行为上到底有什么区别呢?别急,跟着我来一步步揭开它们的神秘面纱。
一、基本特性对比
首先,我们来看看它们的基本属性:
- float:4字节(32位),有效位数6-7位,数值范围±1.5×10⁻⁴⁵ ~ ±3.4×10³⁸,适用于内存敏感场景。
- double:8字节(64位),有效位数15-16位,数值范围±4.9×10⁻³²⁴ ~ ±1.8×10³⁰⁸,适用于通用科学计算、图形处理。
- long double:8/16字节(平台依赖),有效位数18-19位,数值范围更广,适用于高精度数学运算。
二、精度与存储机制
float和double的精度主要由它们的存储机制决定。
float采用IEEE 754单精度格式,尾数部分23位,有效位数约6-7位。
double采用IEEE 754双精度格式,尾数部分52位,有效位数约15-16位。
三、输出行为控制
默认情况下,cout会输出6位有效数字,超出部分四舍五入。
我们可以通过库来调整输出格式,比如使用std::fixed固定小数点表示法、std::scientific科学计数法、setprecision设置有效位数等。
四、跨平台注意事项
long double在不同平台上的存储空间和精度可能不同,需要注意。
使用setprecision和fixed可以确保跨平台输出一致。
五、最佳实践
根据实际需求选择合适的类型,避免精度陷阱,优化输入输出。
六、示例代码对比
#include
#include
int main() {
float f = 1.23456789f;
double d = 1.234567890123456789;
// 默认输出
std::cout <<
