java浮点型只有float和double,区别在于精度、内存和默认行为:float为32位、6–7位有效数字;double为64位、15–16位有效数字,是默认类型;字面量默认double,赋值给float需加f后缀;日常开发优先用double,仅内存受限且精度要求低时用float;金额禁用浮点数,应用bigdecimal;比较浮点数须用误差阈值而非==。

Java 中浮点型只有两个基本类型:float 和 double,它们本质区别在于精度、内存占用和默认行为,不是“用哪个都行”,而是要按需选择。
float 与 double 的核心差异
两者都遵循 IEEE-754 标准,但规格不同:
- float:32 位(4 字节),约 6–7 位有效数字,取值范围约 ±1.4E−45 到 ±3.4E+38
- double:64 位(8 字节),约 15–16 位有效数字,取值范围约 ±4.9E−324 到 ±1.7E+308
简单说,double 精度更高、范围更大、是 Java 默认浮点类型;float 更节省内存,但精度有限,容易累积误差。
字面量写法与赋值规则
Java 对浮点字面量有明确约定,写错会直接编译失败:
- 所有带小数点的数字(如
3.14、0.5、1e-3)默认是 double 类型 - 想赋给
float变量,必须加f或F后缀:float x = 3.14f; - 写成
float y = 3.14;会报错:类型不兼容,不能把 double 赋给 float -
double变量可省略后缀(d或D可加可不加):double a = 3.14;或double b = 3.14d;都合法
什么时候该用 float,什么时候用 double
不要凭感觉选,看实际需求:
- 日常开发、科学计算、逻辑判断等场景——优先用 double。它精度高、不易出错、无需额外后缀,是安全又省心的选择
- 只在明确需要节省内存且精度要求低时才用 float,例如:
• 百万级顶点坐标数组(图形/游戏)
• 传感器原始采样数据(温度、加速度,误差±0.1℃可接受)
• 嵌入式或内存受限环境 -
绝对不要用 float/double 处理金额——小数无法精确二进制表示,会导致 0.1 + 0.2 ≠ 0.3 这类问题。应使用
BigDecimal或整数单位(如“分”)
浮点数比较不能用 ==
由于二进制存储限制,浮点数常是近似值。直接 == 比较极易出错:
- 错误示例:
if (0.1f + 0.2f == 0.3f)→ 结果为false - 正确做法:用差值是否小于一个极小阈值(epsilon)来判断
- 推荐写法:
if (Math.abs(a - b) (double 用 <code>1e-6,float 建议用1e-5f) - 注意:NaN、正负零等特殊值需单独处理,
Float.isNaN()和Double.isNaN()更可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











