我有一些以这种格式输出的双号:
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
答案 0 :(得分:0)
没有内置的方法,你必须自己做。
最简单的方法是像你一样格式化,然后根据需要添加额外的零。
此外,它的String.format
,而非Format.String
以及您提供的"%1.4e"
格式会产生1.1235e+03
,而非1.123456e+03
。< / p>
答案 1 :(得分:0)
我无法在String
或Formatter
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;
它自己给你指数。您应该能够以类似的方式提取有效数字,然后单独格式化。
好像你的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;
}