我正在尝试使用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
答案 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);
}