11. Java 详解浮点数字面量

342 阅读2分钟

11. Java 详解浮点数字面量

Java 中,浮点数默认是 double 类型,除非使用 Ff 指定 float 类型。 Java 支持科学计数法Ee)表示大或小的浮点数。


1️⃣ floatdouble 的区别

类型大小(位)默认类型小数精度示例
float32❌ 需要 f73.14f
double64✅ 默认15-163.1415926535

📌 如果浮点数字面量没有 Ff,默认是 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️⃣ FD 结尾的浮点数

  • Ff表示 float32 位)
  • Dd表示 double64 位,默认可省略)
float floatNumber = 1.23f;  // ✅ float(必须加 f)
double doubleNumber1 = 1.23d;  // ✅ double(d 可省略)
double doubleNumber2 = 1.23;   // ✅ double(默认)

3️⃣ 科学计数法

Java 支持 Ee 表示科学计数法(指数表示法),即 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 浮点数支持无穷大、负无穷大和 NaNNot a Number)

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

🔹 结论

特性描述
默认浮点类型double64 位)
float 需要 Ff否则会报错
D 可选double 可以加 D,但通常省略
支持科学计数法Ee1.2E3 = 1200.0
可以用 _ 分隔符1_000_000.00
浮点数可能有精度误差不能用于货币计算,用 BigDecimal 代替

最佳实践

  • 默认用 doublefloat 仅在大数组优化时使用
  • 避免浮点数用于货币计算,改用 BigDecimal
  • 如果 float 变量,必须加 F
  • 科学计数法适用于大数值计算

🚀 希望这个讲解能帮你彻底掌握 Java 浮点数! 🎯