java – 以给定精度快速双字符串转换

前端之家收集整理的这篇文章主要介绍了java – 以给定精度快速双字符串转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要以给定的精度将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阵列来解决(但只能部分地).后者可以在代码中明确处理.

原文链接:https://www.f2er.com/java/126008.html

猜你在找的Java相关文章