声明变量时写 float 还是 double,很多人随手一敲就过去了。double和float的区别,核心就三点:占用字节、有效精度、默认类型,搞清楚这三点选择就不纠结了。

字节和精度

float 是 32 位单精度,占 4 个字节,有效数字大约 7 位;double 是 64 位双精度,占 8 个字节,有效数字大约 15 到 16 位。0.123456789 这个数,float 存进去再取出来,后两位就不可靠了。所以科学计算、地图坐标这类对精度要求高的场景,默认用 double。

语言里的细节

Java 里小数字面量默认就是 double 类型,写 float price = 3.14 会编译报错,要写成 3.14f;C 和 C++ 里字面量同样默认 double,赋给 float 会有隐式转换。方法重载时 float 和 double 算两个不同签名,传参类型不对会静默匹配到另一个方法,这类 bug 排查起来很隐蔽。C# 里同理,写 3.14 推断出来就是 double,加 f 或 m 后缀才是 float 或 decimal,思路和 Java 一致。

浮点数共同的坑

float 和 double 都是二进制浮点,0.1 加 0.2 不等于 0.3,两个数判断相等也别直接用等号,要比较差值是否小于一个很小的数。这是二进制表示十进制小数天然会有的误差,跟选 float 还是 double 无关,double 只是误差更小。要精确小数又不想引大数库的,把金额按分存成整数也是常见做法,浮点只留给展示。

到底用哪个

  • 金额:都不用,数据库用 DECIMAL,Java 用 BigDecimal
  • 普通计算、函数返回值:直接 double,现代 cpu 上两者速度差别很小
  • 海量数据、图形渲染顶点、GPU 编程:float 省一半内存,缓存友好,很多图形库接口默认就是 float

一句话收尾:拿不准就用 double,它更不容易出错;真到了要省内存或对齐图形接口的时候再用 float,注意数值范围和精度的换算。