从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
免责声明:我只建议你在速度是绝对要求的情况下使用这个。
在我的机器上,以下操作可以在大约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
我很感激每一个暗示,关于转移目标的文件实现。我已经研究了一些关于浮动精度的论文,但在过去的两周里没有取得太大的进展。 提前感谢!