执行以下代码时:
DecimalFormat eNotation1 = new DecimalFormat("#0.###E0");
System.out.println(eNotation1.format(123.456789));
我的预期输出是;
1.235E2
相反
1.2346E2
被打印出来。
为什么输出1.2346E2
?
我知道如果我只想设置小数点后的最大位数,我本可以使用像setMaximumFractionDigits()
这样的方法,但我只是真的想了解为什么输出1.2346E2
如果你想要确切的格式,那么使用模式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));
似乎这种模式会像你期望的那样工作
DecimalFormat eNotation1 = new DecimalFormat("0.000E0");
基本上,对模式使用 0 会导致格式化程序就地使用特定数字并将剩余的数字转换为指数表示法。
在应用指数之前,对同一模式使用 #s,使所有剩余数字适合指定的位数,这意味着您的特定用例将被舍入,然后将剩余数字添加到指数中。
当然,文档对此并不那么清楚:https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html。
"123456.789 ###.## 123456.79 该值在小数点右侧有三位数字,但模式只有两位。format 方法通过向上舍入来处理此问题。