Java BigInteger返回不正确的值

时间:2019-11-07 10:49:42

标签: java biginteger

我正在尝试使用BigInteger生成所有数字的n位数字。

for(int i=0;i<n;i++){
    genL = genL.add(BigDecimal.valueOf(Math.pow(10,i)).toBigInteger());
    System.out.println(i + " "+ genL);
            }

我期望输出结果序列中的所有那些。但是我得到以下输出。对于i = 23和24,将插入零。

0 1

1 11

2 111

3 1111

4 11111

5 111111

6 1111111

7 11111111

8 111111111

9 1111111111

10 11111111111

11 111111111111

12 1111111111111

13 11111111111111

14 111111111111111

15 1111111111111111

16 11111111111111111

17 111111111111111111

18 1111111111111111111

19 11111111111111111111

20 111111111111111111111

21 1111111111111111111111

22 11111111111111111111111

23 111111111111111101111111

24 1111111111111111101111111

4 个答案:

答案 0 :(得分:9)

  

有什么我想念的吗?

是的。 ggplot(myresults_pct, aes(x=manipulation, y=pct,fill=variable)) + geom_col()+ scale_fill_grey()+ geom_text(aes(label = scales::percent(pct)), position="stack",vjust=+2.1,col="firebrick",size=3)+ scale_y_continuous(label = scales::percent) 返回的Math.pow(10,i)仅有53位精度。


您可以重写代码以改用double方法。

但是,(IMO)更简单的版本应该是

BigInteger.pow

或者,如果您仅关心输出是什么样的,则只需使用字符串生成器/字符串串联即可;例如

genL = BigInteger.ZERO;
for (int i = 0; i < n; i++) {
    genL = genL.mult(BigInteger.TEN) + BigInteger.ONE;
    System.out.println(i + " " + genL);
}

答案 1 :(得分:1)

使用BigInteger构造函数创建BigInteger(String val)会更简单(更有效):

new BigInteger("111111111111111111111111111111"); // as many 1s as you want

或者,概括地说:

char[] ones = new char[n];
Arrays.fill(ones,'1');
BigInteger genL = new BigInteger(new String (ones));

答案 2 :(得分:1)

Math.pow返回一个双精度值,不能保证大数的精确度。

在这种情况下,Math.pow(10, 23)返回1.0000000000000001E23,当转换为BigInteger时,它将变为100000000000000010000000,从而导致0出现在中间。

我建议您将Math.pow(10, i)替换为BigInteger.TEN.pow(i)

答案 3 :(得分:0)

您应该按以下方式使用我的代码,就像一个吊饰!

    BigInteger i = new BigInteger("0");
    BigInteger ten = new BigInteger("10");
    BigInteger one = new BigInteger("1");
    for (int j = 0; j < 64; j++) {
        i = i.multiply(ten).add(one);
        System.out.println(i);
    }