Java以指数格式输出双数

时间:2015-09-22 16:42:25

标签: java double string-formatting exponential

我有一些以这种格式输出的双号:

Format.String("%1.4e",doubleNumber);

结果是1.123456e+03。如何设置获取此格式的指数密码数:

1.123456e+003

e符号之后我总是有3个密码。 谢谢

更新1:

我已经部分解决了:

  DecimalFormat formatter = new DecimalFormat("0.000000E000");

System.out.println(formatter.format(doubleNumber));

现在数字始终是格式

1.123456e0xx

1.123456e-0xx

但它并未全部解决。我会一直打印这个标志:

1.123456e+0xx or 1.123456e-0xx

我该怎么办? http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

3 个答案:

答案 0 :(得分:0)

没有内置的方法,你必须自己做。

最简单的方法是像你一样格式化,然后根据需要添加额外的零。

此外,它的String.format,而非Format.String以及您提供的"%1.4e"格式会产生1.1235e+03,而非1.123456e+03。< / p>

答案 1 :(得分:0)

我无法在StringFormatter JavaDoc中看到任何可以直接执行此操作的内容。所以我认为你不得不采取一些措施。

long exponentMask = 0x7ff0000000000000L; // per JavaDoc for Double
// the exponent is in bits 62-52, so I'm thinking a right-shift by 52
// bits would work. But I could be off by one.
int shiftExponentBy = 52;
long myDoubleAsLong = Double.doubleToLongBits(doubleNumber);
long rawExponent = myDoubleAsLong & exponentMask;
long shiftedExponent = rawExponent >> shiftExponentBy;

它自己给你指数。您应该能够以类似的方式提取有效数字,然后单独格式化。

更新1

好像你的Update 1会导致同样的问题,只是表达方式不同。您需要将指数与有效数字分开格式化。 DecimalFormat允许积极的模式和不同的负面模式,但那些是积极的和消极的有效的。你需要一个允许正面和负面指数的变体。我没有看到任何这样的事情。我站在原来的答案旁边。

答案 2 :(得分:0)

谢谢@TDG

  private String formatter(double number){
    DecimalFormat formatter = new DecimalFormat("0.000000E000");
    String fnumber = formatter.format(number);
    if (!fnumber.contains("E-")) { //don't blast a negative sign
        fnumber = fnumber.replace("E", "E+");
    }
    return fnumber;
}