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

を に変換するより良い方法はありませBigDecimaldouble。これは、非常に具体的な丸めセマンティクスを維持しながら、効率的に変換するアルゴリズムfoo * 10^barbaz * 2^quux非常に厄介で不快であるためです。sun.misc.FloatingDecimal詳細については、を参照するか、このペーパーを参照してください。

BigInteger.doubleValue()一方、小数を処理する必要はなく、整数のみを処理する必要があるため、最適化の機会がたくさんあります保留中のJDK パッチBigInteger.doubleValue()がありますが、これは 2 桁強で最適化されますが、まだレビュー待ちです。

更新:この修正は OpenJDK 8 に追加され、2014 年 3 月 18 日に一般公開されました。

于 2013-02-06T22:55:30.107 に答える