这是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/