必须用bigdecimal处理金融计算,因double二进制浮点无法精确表示0.1等十进制小数,导致加减乘除累积误差;正确初始化须用字符串如new bigdecimal("0.1"),避免new bigdecimal(0.1)继承double精度缺陷。

绝大多数情况下,直接用 double,别犹豫;只有明确受限于内存或带宽(比如嵌入式传感器固件、GPU shader 输入、网络协议字段),才考虑 float。
什么时候必须用 double
数值精度一碰就出问题的场景,double 是底线:
- 科学计算、物理模拟(如球体积公式
(4.0/3.0) * M_PI * r * r * r中,4.0默认是double,混用float会触发隐式转换,徒增误差 - 累计运算(如循环加
1.0/81729 次),float结果可能是9.000023,double才接近8.99999999999996—— 虽仍不精确,但误差小一个数量级 - 涉及比较的逻辑,例如
if (x == 0.1),用float x = 0.1f几乎必然失败,因为0.1无法在二进制浮点中精确表示,而double至少多撑几轮迭代 - 标准库函数(如
sin、log、sqrt)默认接受double,传float会先升为double再算,白费一次转换
float 后缀 f 不只是“写法”,它强制类型和精度边界
3.14 是 double,3.14f 才是 float。漏掉 f 会导致静默降级:
-
float x = 10.0 / 3;:先算double除法(10.0 / 3.0),再截断成float,丢失低位信息 -
float x = 10.0f / 3.0f;:全程float运算,结果确定、可复现,且不依赖中间double精度 - 函数重载也认这个后缀:
std::pow(2.0f, 3.0f)调float pow(float, float),而std::pow(2.0, 3.0)调double pow(double, double)
long double 并不值得常规使用
它在多数平台(Linux x86_64)是 80 位扩展精度,但:
- Windows MSVC 下
long double就是double,无额外精度 - 编译器可能禁用其优化,运行时慢;ABI 兼容性差,跨模块传参易出错
- 标准库 I/O(如
std::cout )对 <code>long double支持不稳定,常被悄悄转成double输出 - 除非你在做高精度数学库或金融结算(此时更该用定点数或
int64_t表示分),否则纯属增加维护成本
真正容易被忽略的是:浮点数不是实数——无论 float 还是 double,它们都只能近似表示十进制小数。选型解决不了根本问题,它只决定你“近似得多粗糙”。关键判断永远落在:这个变量是否参与比较?是否被反复累加?是否要和用户预期值对齐?想清楚这三点,double 就已经覆盖了 95% 的日常需求。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











