您可以编写自己的例程,只要您确切知道自己想要什么。
public static void appendTo6(StringBuilder builder, double d) { if (d < 0) { builder.append('-'); d = -d; } if (d * 1e6 + 0.5 > Long.MAX_VALUE) { // TODO write a fall back. throw new IllegalArgumentException("number too large"); } long scaled = (long) (d * 1e6 + 0.5); long factor = 1000000; int scale = 7; long scaled2 = scaled / 10; while (factor <= scaled2) { factor *= 10; scale++; } while (scale > 0) { if (scale == 6) builder.append('.'); long c = scaled / factor % 10; factor /= 10; builder.append((char) ('0' + c)); scale--; }}@Testpublic void testCases() { for (String s : "-0.000001,0.000009,-0.000010,0.100000,1.100000,10.100000".split(",")) { double d = Double.parseDouble(s); StringBuilder sb = new StringBuilder(); appendTo6(sb, d); assertEquals(s, sb.toString()); }}public static void main(String[] args) { StringBuilder sb = new StringBuilder(); long start = System.nanoTime(); final int runs = 20000000; for (int i = 0; i < runs; i++) { appendTo6(sb, i * 1e-6); sb.setLength(0); } long time = System.nanoTime() - start; System.out.printf("Took %,d ns per append double%n", time / runs);}版画
Took 128 ns per append double
如果您想获得更高的性能,则可以写入直接的ByteBuffer(假设您想将数据写入某处),因此您产生的数据确实需要复制或编码。(假设还可以)
注意:这仅限于小于9万亿(Long.MAX_VALUE / 1e6)的正/负值。如果这可能是一个问题,则可以添加特殊处理。



