11. Java 详解浮点数字面量
在 Java
中,浮点数默认是 double
类型,除非使用 F
或 f
指定 float
类型。
Java
支持科学计数法(E
或 e
)表示大或小的浮点数。
1️⃣ float
和 double
的区别
类型 | 大小(位) | 默认类型 | 小数精度 | 示例 |
---|---|---|---|---|
float |
32 |
❌ 需要 f
|
7 位 |
3.14f |
double |
64 |
✅ 默认 |
15-16 位 |
3.1415926535 |
📌 如果浮点数字面量没有 F
或 f
,默认是 double
float piFloat = 3.14f; // ✅ 正确
double piDouble = 3.14; // ✅ 正确(默认 double)
⚠ 错误示例
float errorFloat = 3.14; // ❌ 错误:默认是 double,不能赋值给 float
✅ 正确做法
float correctFloat = 3.14f; // ✅ 正确
float alsoCorrect = (float) 3.14; // ✅ 正确(强制转换)
2️⃣ F
、D
结尾的浮点数
-
F
或f
→ 表示float
(32
位) -
D
或d
→ 表示double
(64
位,默认可省略)
float floatNumber = 1.23f; // ✅ float(必须加 f)
double doubleNumber1 = 1.23d; // ✅ double(d 可省略)
double doubleNumber2 = 1.23; // ✅ double(默认)
3️⃣ 科学计数法
Java 支持 E
或 e
表示科学计数法(指数表示法),即 base × 10^exponent
double bigNumber = 1.2E3; // 1.2 × 10³ = 1200.0
double smallNumber = 5.6e-4; // 5.6 × 10⁻⁴ = 0.00056
💡 等价写法
double bigNumber = 1.2E3; // 等价于 1200.0
double smallNumber = 5.6e-4; // 等价于 0.00056
4️⃣ _
分隔符(Java 7+)
Java 7 允许使用 _
作为分隔符,提高可读性:
double million = 1_000_000.00; // ✅ 1,000,000.00
float scientific = 3.14_159_265f; // ✅ 3.14159265
System.out.println(million); // 输出 1000000.0
⚠ 错误用法
double wrong = 100_.50; // ❌ 不能放在小数点前后
double alsoWrong = 1._23; // ❌ 不能紧跟着小数点
5️⃣ 浮点数的特殊值
Java
浮点数支持无穷大、负无穷大和 NaN
(Not a Numbe
r):
System.out.println(Double.POSITIVE_INFINITY); // ∞
System.out.println(Double.NEGATIVE_INFINITY); // -∞
System.out.println(Double.NaN); // NaN(非数值)
✅ 无穷大示例
double infinity = 1.0 / 0; // ✅ 输出 ∞
double negInfinity = -1.0 / 0; // ✅ 输出 -∞
✅ NaN
(非数值)示例
double notANumber = 0.0 / 0.0; // ✅ NaN
System.out.println(Double.isNaN(notANumber)); // ✅ true
6️⃣ BigDecimal
处理精确小数
⚠️ 浮点数不能用于精确计算(如货币计算)!
double a = 0.1 + 0.2;
System.out.println(a); // ❌ 结果:0.30000000000000004(精度丢失)
✅ 正确方式:使用 BigDecimal
import java.math.BigDecimal;
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal result = a.add(b);
System.out.println(result); // ✅ 0.3
7️⃣ 浮点数的精度误差
浮点数的计算可能会有误差:
System.out.println(0.1 + 0.2 == 0.3); // ❌ false(0.30000000000000004)
✅ 解决方案
- 用
BigDecimal
进行精确计算 - 用
Math.round()
进行四舍五入
double sum = 0.1 + 0.2;
double rounded = Math.round(sum * 100.0) / 100.0;
System.out.println(rounded); // ✅ 0.3
🔹 结论
特性 | 描述 |
---|---|
默认浮点类型 |
double (64 位) |
float 需要 F 或 f |
否则会报错 |
D 可选 |
double 可以加 D ,但通常省略 |
支持科学计数法 |
E 或 e (1.2E3 = 1200.0 ) |
可以用 _ 分隔符 |
1_000_000.00 |
浮点数可能有精度误差 |
不能用于货币计算,用 BigDecimal 代替 |
✅ 最佳实践
- 默认用
double
,float
仅在大数组优化时使用 - 避免浮点数用于货币计算,改用
BigDecimal
- 如果
float
变量,必须加F
- 科学计数法适用于大数值计算
🚀 希望这个讲解能帮你彻底掌握 Java
浮点数! 🎯