什么是科学计数法?
科学计数法是一种表示非常大或非常小的数字的方法,它的标准形式是:

a × 10^b
a是一个系数,其绝对值大于或等于 1 且小于 10 (即1 ≤ |a| < 10)。b是一个指数,是一个整数。
在计算机科学和编程中,为了简洁和高效,科学计数法通常被表示为 E-notation(E表示指数 Exponent)。
E-notation 的格式是:
aEb

这里的 E(不区分大小写,e 也可以)代表 "乘以 10 的...次方"。
- 示例:
23e4表示23 × 10^4,即0。67E-2表示67 × 10^-2,即0567。0e8表示光速0 × 10^8,即0。
在 Java 中如何使用科学计数法?
在 Java 中,科学计数法主要用于两个方面:
- 在代码中直接为
double或float字面量赋值。 - 将
double或float的值以科学计数法的形式输出。
在代码中使用科学计数法赋值
你可以直接在 Java 代码中使用 e 或 E 来定义 double 或 float 类型的变量。
代码示例:

public class ScientificNotationExample {
public static void main(String[] args) {
// 使用 e 定义 double
double largeNumber = 1.23e4; // 1.23 * 10^4 = 12300.0
double smallNumber = 5.67e-2; // 5.67 * 10^-2 = 0.0567
// 使用 E 定义 double (效果相同)
double speedOfLight = 3.0E8; // 3.0 * 10^8 = 300000000.0
// 使用 f 后缀定义 float
float smallFloat = 1.5e-3f; // 1.5 * 10^-3 = 0.0015
// 打印结果
System.out.println("largeNumber (1.23e4): " + largeNumber);
System.out.println("smallNumber (5.67e-2): " + smallNumber);
System.out.println("speedOfLight (3.0E8): " + speedOfLight);
System.out.println("smallFloat (1.5e-3f): " + smallFloat);
// 验证
System.out.println("Is 1.23e4 equal to 12300.0? " + (largeNumber == 12300.0));
}
}
输出:
largeNumber (1.23e4): 12300.0
smallNumber (5.67e-2): 0.0567
speedOfLight (3.0E8): 3.0E8
smallFloat (1.5e-3f): 0.0015
Is 1.23e4 equal to 12300.0? true
从输出中可以看到,speedOfLight 打印出来仍然是 0E8,这是因为 Java 的默认 System.out.println() 会智能地选择最简洁的表示方式,对于 0,0E8 显然更简洁。
将 double 值以科学计数法形式输出
当你需要将一个 double 变量的值格式化为科学计数法字符串时,可以使用 String.format() 方法或 DecimalFormat 类。
使用 String.format()
这是最简单直接的方法,格式化符 %e 或 %E 用于科学计数法。
%e:使用小写e。%E:使用大写E。- 你可以指定小数点后的位数,
%.2e表示保留两位小数。
代码示例:
public class DoubleFormatting {
public static void main(String[] args) {
double value = 123456.789;
// 使用 %e (小写 e)
String formattedE = String.format("%.2e", value);
System.out.println("格式化为 %.2e: " + formattedE); // 输出: 1.23e+05
// 使用 %E (大写 E)
String formattedCapitalE = String.format("%.4E", value);
System.out.println("格式化为 %.4E: " + formattedCapitalE); // 输出: 1.2346E+05
// 不指定小数位数,默认6位
String formattedDefault = String.format("%e", value);
System.out.println("格式化为 %e (默认): " + formattedDefault); // 输出: 1.234568e+05
}
}
输出:
格式化为 %.2e: 1.23e+05
格式化为 %.4E: 1.2346E+05
格式化为 %e (默认): 1.234568e+05
使用 java.text.DecimalFormat
DecimalFormat 提供了更强大的格式化功能。
代码示例:
import java.text.DecimalFormat;
public class DecimalFormatExample {
public static void main(String[] args) {
double value = 123456.789;
// 创建 DecimalFormat 模式
// 0 表示一个数字,如果不存在则补0
# 表示一个数字,如果不存在则不显示
DecimalFormat scientificFormat = new DecimalFormat("0.###E0");
DecimalFormat scientificFormatMore = new DecimalFormat("0.0000E00");
System.out.println("格式化为 0.###E0: " + scientificFormat.format(value)); // 输出: 1.235E5
System.out.println("格式化为 0.0000E00: " + scientificFormatMore.format(value)); // 输出: 1.2346E05
}
}
输出:
格式化为 0.###E0: 1.235E5
格式化为 0.0000E00: 1.2346E05
重要的注意事项
精度问题
double 在 Java 中是使用 IEEE 754 标准的 64 位浮点数来存储的,它本身就不是精确的十进制数表示,科学计数法只是其一种显示或输入格式,并不能解决其固有的精度问题。
示例:
double d1 = 0.1; double d2 = 0.2; System.out.println(d1 + d2); // 输出可能是 0.30000000000000004 // 使用科学计数法并不能改变这个事实 double d3 = 3.0e-1; // 0.3 System.out.println(d1 + d2 == d3); // 输出 false
对于需要高精度的计算,应该使用 java.math.BigDecimal 类。
默认输出
如前所述,System.out.println(double) 会自动选择最简洁的表示方式,可能是常规小数,也可能是科学计数法。
double d1 = 123456.0; double d2 = 0.0000123; System.out.println(d1); // 输出 123456.0 (常规小数更简洁) System.out.println(d2); // 输出 1.23E-5 (科学计数法更简洁)
float 和 double 的后缀
double类型的字面量默认带有d或D后缀,但通常可以省略。float类型的字面量必须带有f或F后缀,否则编译器会将其视为double。
float f1 = 1.23e4f; // 正确 float f2 = 1.23e4; // 编译错误: 不兼容的类型: 从double转换到float可能会有损失 double d1 = 1.23e4; // 正确 double d2 = 1.23e4d; // 正确,但 d 是多余的
| 场景 | 方法 | 示例 | 说明 |
|---|---|---|---|
| 代码中赋值 | 直接使用 e 或 E |
double num = 1.23e4; |
定义 double 或 float 字面量。float 必须加 f 后缀。 |
| 格式化输出 | String.format() |
String.format("%.2e", num) |
使用 %e 或 %E 格式化符,控制小数位数。 |
| 格式化输出 | DecimalFormat |
new DecimalFormat("0.###E0").format(num) |
使用模式字符串进行更复杂的格式化控制。 |
| 默认打印 | System.out.println() |
System.out.println(num); |
自动选择最简洁的表示方式(常规或科学计数法)。 |
| 精度问题 | double 的局限性 |
1 + 0.2 != 0.3 |
科学计数法不解决浮点数精度问题,高精度计算请用 BigDecimal。 |
