繁体   English   中英

BigDecimal.movePointRight()挂起非常大的数字

[英]BigDecimal.movePointRight() hangs with very large numbers

以下程序冻结,我无法弄清楚原因。

import java.math.*;

public class BigDec {
  public static BigDecimal exp(double z) {
       // Find e^z = e^intPart * e^fracPart.
       return new BigDecimal(Math.E).pow((int)z, MathContext.DECIMAL128).
           multiply(new BigDecimal(Math.exp(z-(int)z)), MathContext.DECIMAL128);
   }

   public static void main(String[] args) {
       // This works OK:
       BigDecimal x = new BigDecimal(3E200);
       System.out.println("x=" + x);
       System.out.println("x.movePointRight(1)=" + x.movePointRight(1));

       // This does not:
       x = exp(123456789);
       System.out.println("x=" + x);
       System.out.println("x.movePointRight(1)=" + x.movePointRight(1)); //hangs
   }
}

就目前而言,第一种方法只是创建一个非常大的BigDecimal。 (细节:它找到了z的力量,即使它太大而不是双倍。我很确定这种方法是正确的,尽管MathContexts可能不是最好的地方。)

我知道e ^ 123456789非常大,但我确实想要使用这样的数字。 非常感谢任何答案。

事实上它并没有冻结,但是在Oracle的VM中实现movePointRight可能效率极低。 使用10的幂乘以或除以使用movePointRightmovePointLeft方法通常要快得多。 在您的情况下,使用x.multiply(BigDecimal.TEN)可能会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM