我需要以给定的精度将double转换成string. String.format(“%.3f”,value)(或DecimalFormat)执行该作业,但是基准测试显示,与不是非常快的Double.toString转换(约1-3秒转换我的机器上的100万个数字) ).
有没有更好的办法呢?
更新:基准测试结果
随机数从0到1000000,结果是每毫秒的操作(Java 1.7.0_45)
Benchmark Mean Mean error Units String_format 747.394 13.197 ops/ms BigDecimal_toPlainString 1349.552 31.144 ops/ms DecimalFormat_format 1890.917 28.886 ops/ms Double_toString 3341.941 85.453 ops/ms DoubleFormatUtil_formatDouble 7760.968 87.630 ops/ms SO_User_format 14269.388 168.206 ops/ms
解决方法
免责声明:我只建议您使用这个速度是绝对的要求.
在我的机器上,以下可以在130ms内完成100万次转换:
private static final int POW10[] = {1,10,100,1000,10000,100000,1000000}; public static String format(double val,int precision) { StringBuilder sb = new StringBuilder(); if (val < 0) { sb.append('-'); val = -val; } int exp = POW10[precision]; long lval = (long)(val * exp + 0.5); sb.append(lval / exp).append('.'); long fval = lval % exp; for (int p = precision - 1; p > 0 && fval < POW10[p]; p--) { sb.append('0'); } sb.append(fval); return sb.toString(); }
所提供的代码有几个缺点:它只能处理有限的双打,并且不处理NaN.前者可以通过扩展POW10阵列来解决(但只能部分地).后者可以在代码中明确处理.