使用DecimalFormat的科学记数法中有效数字的位数

Age*_*men 15 java decimalformat

我试图完全理解DecimalFormat的确切行为.我目前正在用这个类的科学记谱功能进行一些测试.而且我在调整科学记数法中有效位数的确切问题时遇到了问题.根据Java 7的Javadoc:

尾数中的有效位数是最小整数和最大小数位的总和,并且不受最大整数位数的影响.例如,用"## 0.## E0"格式化的12345是"12.3E3".要显示所有数字,请将有效数字计数设置为零.有效位数不会影响解析.

因此,我正在测试它:

DecimalFormat formatone = new DecimalFormat("##0.##E0");
System.out.println(formatone.format(toF));
Run Code Online (Sandbox Code Playgroud)

我获得以下输出:

12,345E3
Run Code Online (Sandbox Code Playgroud)

根据我刚刚展示的Javadoc的摘录,我想我应该获得

12.3E3
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么 ?我理解错了吗?

在此先感谢您的所有澄清:-)

pas*_*qui 6

我在"## 0.## E0"的情况下打印了最小/最大整数/小数位的值,并验证了@Agemen给出的结果:

DecimalFormat df = new DecimalFormat( "##0.##E0" );
System.out.printf("getMinimumIntegerDigits=%d\n", df.getMinimumIntegerDigits() );
System.out.printf("getMaximumIntegerDigits=%d\n", df.getMaximumIntegerDigits() );
System.out.printf("getMinimumFractionDigits=%d\n", df.getMinimumFractionDigits() );
System.out.printf("getMaximumFractionDigits=%d\n", df.getMaximumFractionDigits() );

double v = 12345;
System.out.printf("s=%f\n", v );
System.out.printf("r=%s\n", df.format(v) );
Run Code Online (Sandbox Code Playgroud)

结果:

getMinimumIntegerDigits=1
getMaximumIntegerDigits=3
getMinimumFractionDigits=0
getMaximumFractionDigits=2
s=12345.000000
r=12.345E3
Run Code Online (Sandbox Code Playgroud)

在我看来,这是Java实现或文档中的错误,未获得预期的结果.

关于@JoopEggen答案中给出的示例,它不适用,因为模式"##0.#####E0"的最大分数位数等于5.

实际上,使用模式获得预期的字符串"##0.E0".

该错误可能在文件DecimalFormat.java中,在语句处:

digitList.set(isNegative, number,
useExponentialNotation ? 
maxIntDigits + maxFraDigits : maxFraDigits,
!useExponentialNotation);
Run Code Online (Sandbox Code Playgroud)

添加"maxIntDigits + maxFraDigits"应该是" minIntDigits + maxFraDigits"以同意java文档.


Joo*_*gen 0

http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html得出以下“解释”。有人想知道。

最小和最大整数位数一起解释:

如果最大整数位数大于最小整数位数且大于 1,则强制指数为最大整数位数的倍数,并且最小整数位数被解释为 1。最常见的使用它可以生成工程符号,其中指数是三的倍数,例如“##0.#####E0”。使用此模式,数字 12345 格式为“12.345E3”,123456 格式为“123.456E3”。