6

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

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

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

4

1 回答 1

11

没有更好的方法将 a 转换BigDecimal为 a doublefoo * 10^bar这是因为要高效地转换为的算法baz * 2^quux,同时保持非常具体的舍入语义,是非常讨厌和不愉快的——请参阅sun.misc.FloatingDecimal详细信息,或阅读本文

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

更新:该修复已添加到 OpenJDK 8 中,于 2014 年 3 月 18 日向公众提供。

于 2013-02-06T22:55:30.107 回答