Fast double to string conversion with given precision

前端 未结 4 1193
遥遥无期
遥遥无期 2021-02-02 17:14

I need to convert double to string with given precision. String.format(\"%.3f\", value) (or DecimalFormat) does the job but benchmarks show that it slow even in com

4条回答
  •  南旧
    南旧 (楼主)
    2021-02-02 17:28

    Disclaimer: I only recommend that you use this if speed is an absolute requirement.

    On my machine, the following can do 1 million conversions in about 130ms:

     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();
     }
    

    The code as presented has several shortcomings: it can only handle a limited range of doubles, and it doesn't handle NaNs. The former can be addressed (but only partially) by extending the POW10 array. The latter can be explicitly handled in the code.

提交回复
热议问题