java - 提高 BigDecimal 到双转换的性能

标签 java performance double bigdecimal

这是BigDecimal.doubleValue()的Jdk7-b147版本

public double doubleValue(){
  if (scale == 0 && intCompact != INFLATED)
    return (double)intCompact;
  // Somewhat inefficient, but guaranteed to work.
  return Double.parseDouble(this.toString());
}

他们承认这种方式效率低下!有没有比使用这种方法更好/更快的方法?

最佳答案

没有更好的方法可以将 BigDecimal 转换为 double。这是因为将 foo * 10^bar 有效地转换为 baz * 2^quux 的算法在保持非常具体的舍入语义的同时,非常令人讨厌和不愉快——请参阅 sun.misc.FloatingDecimal有关详细信息,或阅读 this paper

BigInteger.doubleValue() 另一方面,确实有很多优化机会,因为它不需要处理小数,而只需要处理整数。我有一个 JDK patch pending 优化 BigInteger.doubleValue() 略多于两个数量级,尽管它仍在等待审查。

更新:此修复已添加到 OpenJDK 8 中,并于 2014 年 3 月 18 日向公众开放。

关于java - 提高 BigDecimal 到双转换的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739823/

相关文章:

java - 以 'yyyy-MM-dd' 格式计算当前年份在 Java 中设置了不正确的值

java - 为什么主线程不能比较两个由其他线程更新的变量?

c - 为什么 C 快速排序函数(磁带比较、磁带交换)比冒泡排序函数慢得多?

java - 对于不带小数的 double 格式,在 2 位后截去小数

matlab - 多标签多类数据的平均精度

java - 从 Double.toLongBits 创建的 long 中获取 double

java - 您可以链接两个 JFormattedTextField 的值吗?

parsing - Haskell 无法读取这个 double : ".3". 这是一个错误吗?

java - 以毫秒为单位计算图的平均遍历时间给出了不可思议的输出?

java - 安卓 Java : Understanding Activity Life?