当前位置: 首页 > 知识库问答 >
问题:

给定精度的快速double到string转换

穆宾白
2023-03-14

从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

Java 10,+RYU

                                Mode  Cnt      Score      Error   Units
String_format                  thrpt   20    998.741 ±   52.704  ops/ms
BigDecimal_toPlainString       thrpt   20   2079.965 ±  101.398  ops/ms
DecimalFormat_format           thrpt   20   2040.792 ±   48.378  ops/ms
Double_toString                thrpt   20   3575.301 ±  112.548  ops/ms
DoubleFormatUtil_formatDouble  thrpt   20   7206.281 ±  307.348  ops/ms
ruy_doubleToString             thrpt   20   9626.312 ±  285.778  ops/ms
SO_User_format                 thrpt   20  17143.901 ± 1307.685  ops/ms

共有1个答案

孔永年
2023-03-14

免责声明:我只建议你在速度是绝对要求的情况下使用这个。

在我的机器上,以下操作可以在大约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();
 }

所给出的代码有几个缺点:它只能处理有限范围的doubles,并且不能处理NANs。前者可以通过扩展POW10数组来解决(但只能部分解决)。后者可以在代码中显式处理。

 类似资料:
  • 问题内容: 我需要以给定的精度将double转换为字符串。(或DecimalFormat)可以完成这项工作,但基准测试显示,即使转换速度不是非常快(在我的计算机上转换一百万个数字,大约需要1-3秒),它的速度仍然很慢。 有什么更好的方法吗? 更新:基准化结果 从0到1000000的随机数,结果是以毫秒为单位的操作数(Java 1.7.0_45) 更新: Java 10 + Ryu 问题答案: 免责

  • 问题内容: 尝试如下 输出:12.0 但我想获得12.00的精度 请让我知道正确的方法,而不在字符串类中使用format()方法 问题答案: 使用而不是双重: 之所以有效,是因为保持了“精度”,构造函数将其设置为从右边的数字开始,并在中使用它。因此,如果仅将其丢弃,它就会打印出来。

  • 问题内容: 我正在使用完全基于双精度的应用程序,并且在将字符串解析为双精度的一种实用程序方法中遇到麻烦。我找到了一个解决方法,其中使用BigDecimal进行转换可以解决该问题,但是当我打算将BigDecimal转换回double时又提出了另一个问题:我失去了几个精度位。例如: 这将产生以下输出: 格式化的double值表明它已经失去了第三位的精度(应用程序要求较低的精度)。 如何获得BigDec

  • 更新。麻烦在于:“By drivers使用SQL locator(Clob)实现Clob对象,这意味着Clob对象包含一个指向SQL Clob数据的逻辑指针,而不是数据本身。”如何将CLOB值内联(当我使用next()时)? 附言。因为英语不好。

  • 问题内容: 在Java中,我想要一个双精度值并将其转换为a 并以一定的精度打印出它的String值。 它打印出这个巨大的东西: 47.47999999999999687361196265555918216705322265625 并不是 47.48 我进行转换的原因是有时double值将包含很多小数位(即),而将double转换为String时将产生科学计数法。我想以非科学计数法存储String值

  • 在Java中,我想取一个double值并将其转换为并打印出其字符串值以达到一定精度。 我进行转换的原因是,有时double值会包含很多小数位(即),而当将double转换为字符串时,会生成科学符号。我想用非科学符号存储字符串值。 我想让BigDecimal始终有两个精度单位,像这样:“47.48”。BigDecimal可以限制转换为字符串时的精度吗?

  • 问题内容: 我的号码是654987。它是数据库中的ID。我想将其转换为字符串。常规的Double.ToString(value)使它成为科学形式6.54987E5。我不想要的东西。 我发现的其他格式化功能会检查当前的语言环境,并添加适当的千位分隔符等。由于它是一个ID,我完全不能接受任何格式。 怎么做? [编辑]要澄清:我正在一个特殊的数据库上工作,该数据库将所有数字列都视为双精度。 Double

  • 我很感激每一个暗示,关于转移目标的文件实现。我已经研究了一些关于浮动精度的论文,但在过去的两周里没有取得太大的进展。 提前感谢!