返回错误值的Java BigInteger

返回错误值的Java BigInteger,java,biginteger,Java,Biginteger,我正在尝试使用BigInteger生成所有数字的n位数 for(int i=0;i 有什么我遗漏的吗 是的。Math.pow(10,i)返回一个double,它只有53位精度 您可以重写代码,改用biginger.pow方法 然而,(海事组织)更简单的版本将是 genL = BigInteger.ZERO; for (int i = 0; i < n; i++) { genL = genL.mult(BigInteger.TEN) + BigInteger.ONE; Sy

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

for(int i=0;i
有什么我遗漏的吗

是的。
Math.pow(10,i)
返回一个
double
,它只有53位精度


您可以重写代码,改用
biginger.pow
方法

然而,(海事组织)更简单的版本将是

genL = BigInteger.ZERO;
for (int i = 0; i < n; i++) {
    genL = genL.mult(BigInteger.TEN) + BigInteger.ONE;
    System.out.println(i + " " + genL);
}
genL=biginger.ZERO;
对于(int i=0;i
或者,如果您只关心输出的外观,只需使用字符串生成器/字符串连接;例如

genL = new StringBuilder();
for (int i = 0; i < n; i++) {
    genL.append("1");
    System.out.println(i + " " + genL);
}
genL=newstringbuilder();
对于(int i=0;i
使用
biginger(String val)
构造函数创建
biginger
会更简单(也更高效):

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));

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

在此情况下,<代码>数学.POW(10, 23)返回<代码> 1 000000000000000 1E23 ,当转换为BigInteger时,它变为<代码> 10000 000 000 000 01000000 ,从而导致<<代码> 0 /代码>中。


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

您应该按如下方式使用我的代码,效果非常好

    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);
    }
BigInteger i=新的BigInteger(“0”);
BigInteger十=新的BigInteger(“10”);
BigInteger one=新的BigInteger(“1”);
对于(int j=0;j<64;j++){
i=i.乘(十)加(一);
系统输出打印LN(i);
}

只打印一个简单的字符串,并在末尾添加“1”会简单得多。只是为了记录:当您要打印像1、11、111这样的字符串时,只需将它们视为字符串。从“1”开始,并继续在其后面添加“1”。那么无论如何,打印“0”的可能性为零。