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

问题描述 投票:15回答:4

执行以下代码时:

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

我的预期产量是;

1.延迟

代替,

1.2346E2

被打印了。

为什么输出1.2346E2

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

java decimalformat scientific-notation
4个回答
15
投票

如果你想要那种确切的格式,那么使用模式0.000E0

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

1.235E2

至于为什么你看到你当前的行为,#占位符是可选数字,这意味着DecimalFormat没有义务实际使用它们,就像你在模式中使用它们一样。唯一的要求似乎是科学记数法输出中出现的总位数匹配。在这种情况下,总位数是5,所以我们得到输出1.2346E2


3
投票

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

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

2
投票

似乎这种模式将按预期工作

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

1
投票

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

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

当然,文件并不清楚:https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html

“123456.789 ###。## 123456.79该值在小数点右边有三位数,但模式只有两位。格式化方法通过向上舍入来处理。”

© www.soinside.com 2019 - 2024. All rights reserved.