String.format() 用 "%.2E" 可输出如 1.23E+05 的科学计数法,加 "+" 标志显式正号,但指数宽度固定为两位;需三位指数时应改用 DecimalFormat。

在 Java 中,String.format() 可以通过 E 转换符实现科学计数法输出,但要得到像 1.23E+05 这样带固定小数位、正号显式、指数宽度标准化(如两位)的格式,需组合使用格式说明符中的精度、标志和宽度控制。
指定小数位数与科学计数法转换
使用 "%.[n]E" 控制小数位数(n 为数字位数),例如 "%.2E" 表示保留两位小数:
String s = String.format("%.2E", 123000.0); // 输出:1.23E+05
注意:默认指数部分为“+”或“−”后跟至少两位数字(JDK 7+),所以 123000.0 → 1.23E+05 符合要求;而 0.00123 → 1.23E-03 同样自动补零。
强制显示正号(+)并统一指数宽度
String.format() 默认对正数省略 + 号。如需强制显示(如 +1.23E+05),需添加 + 标志:
立即学习“Java免费学习笔记(深入)”;
String s = String.format("%+.2E", 123000.0); // 输出:+1.23E+05
指数部分的宽度(如 +05 中的 05)由 JVM 自动保证最小两位,不可直接指定为三位(如 005)。若需固定三位指数(如 E+005),String.format() 原生不支持,需后续字符串处理或改用 DecimalFormat。
避免常见陷阱
- 不要混用
f和E:例如"%.2f"输出十进制(123000.00),不是科学计数法。 - 注意参数类型:必须传入
double或Double;传int会触发隐式转换,但推荐显式写123000.0或(double)123000。 - 区域设置影响:默认使用 JVM 默认 locale,若 locale 使用逗号作小数点(如德语),可能输出
1,23E+05。如需严格英文格式,应指定Locale.ENGLISH:
String s = String.format(Locale.ENGLISH, "%.2E", 123000.0); // 确保小数点为 "."
补充:需要更精细控制时的替代方案
若需自定义指数位数(如三位)、左对齐、或前导零填充等,String.format() 表达能力有限。此时推荐使用 java.text.DecimalFormat:
DecimalFormat df = new DecimalFormat("0.00E000");
df.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ENGLISH));
String s = df.format(123000.0); // 输出:1.23E005
注意:DecimalFormat 中 E000 表示指数至少三位(无符号),配合 setPositivePrefix("+") 可进一步加正号。


















