这是 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日对公众开放。

07-26 06:34