为什么此代码中未遵循模式字符串?

Why was the pattern string not followed in this code?

执行以下代码时:

DecimalFormat eNotation1 = new DecimalFormat("#0.###E0");   
System.out.println(eNotation1.format(123.456789)); 

我的预期输出是;

1.235E2

相反,

1.2346E2

已打印。

为什么输出是1.2346E2?

我知道我可以使用像 setMaximumFractionDigits() 这样的方法,如果我只想设置小数点后的最大位数,但我真的很想了解为什么输出是 1.2346E2

看起来这个模式会像你预期的那样工作

DecimalFormat eNotation1 = new DecimalFormat("0.000E0");

如果您想要那种确切的格式,请使用模式 0.000E0:

DecimalFormat eNotation1 = new DecimalFormat("0.000E0");
System.out.println(eNotation1.format(123.456789));

1.235E2

至于为什么你会看到你当前的行为,#占位符是可选数字,这意味着DecimalFormat 没有义务完全按照您在模式中使用它们的方式实际使用它们。唯一的要求似乎是科学记数法输出中出现的总位数匹配。在这种情况下,总位数为五,因此我们得到输出 1.2346E2.

为了更好地适应您的第一个模式,我将删除第一个 #。像这样你适合国际单位制,同时在点后保留可选数字。

DecimalFormat eNotation1 = new DecimalFormat("0.###E0");   
System.out.println(eNotation1.format(123.456789));

基本上,对您的模式使用 0 会导致格式化程序在适当的位置使用特定数字并将其余数字转换为指数表示法。

对相同的模式使用#s,使所有剩余的数字都符合指定的位数,然后再应用指数,这意味着您的特定用例将被四舍五入,然后剩余的数字将被添加到指数中。

当然文档没有那么清楚:https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html

"123456.789 ###.## 123456.79 该值在小数点右侧有三位,但模式只有两位。格式方法通过四舍五入处理。"