Java 为什么在这段代码中没有遵循模式字符串?

Java 为什么在这段代码中没有遵循模式字符串?,java,decimalformat,scientific-notation,Java,Decimalformat,Scientific Notation,执行以下代码时: 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.###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
没有义务实际使用它们,就像您在模式中使用它们一样。唯一的要求似乎是科学符号输出中出现的总位数匹配。在本例中,总位数为5,因此我们得到输出
1.2346E2

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

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

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

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

当然,上面的文档不是很清楚:


“123456.789########123456.79该值在小数点右侧有三位数字,但模式只有两位。format方法通过四舍五入来处理此问题。”

Yes DecimalFormat(“0.000E0”)将打印1.235E2,但我仍然想知道为什么输出不是1.235E2,问题中给出了代码段。因为十进制格式中#和0之间的差异在于这个数字的存在。如果你使用#这里有几个选项来表示这个数字,这就是为什么它会错误地处理一些数字。