提高BigDecimal的性能以实现双倍转换

时间:2013-02-06 22:09:06

标签: 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());
}

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

1 个答案:

答案 0 :(得分:11)

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日向公众开放。