Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当计算能力增强时,Java和Python会产生不同的结果_Java_Python - Fatal编程技术网

当计算能力增强时,Java和Python会产生不同的结果

当计算能力增强时,Java和Python会产生不同的结果,java,python,Java,Python,我试图通过在projecteuler.net上解决问题来自学Java,就像我之前在Python上所做的那样。在尝试解决问题16时,我复制了以前在Python中使用的方法。但是,两种语言的结果输出不同。我认为这与Java数据类型不同于Python有关。问题是对数字2^1000中的数字求和 在Python中: def sumdigits(n): s = 0 while n > 0: s = s + (n % 10) n = n / 10 return s print sumdi

我试图通过在projecteuler.net上解决问题来自学Java,就像我之前在Python上所做的那样。在尝试解决问题16时,我复制了以前在Python中使用的方法。但是,两种语言的结果输出不同。我认为这与Java数据类型不同于Python有关。问题是对数字2^1000中的数字求和

在Python中:

def sumdigits(n):
s = 0
while n > 0:
    s = s + (n % 10)
    n = n / 10
return s
print sumdigits(pow(2,1000))
在Java中:

    public static double SumDigits(double n){
            double s = 0;
            while (n > 0){
                s = s + (n % 10);
                n = n / 10;}
            return s;
            }

System.out.println(SumDigits(Math.pow(2,1000)));
Python生成了正确的结果,Java生成了1197.1463275484991


为什么它们会不同?

Java中的基本数字类型是int和double。两者都不能处理1000位的数字。Python内置了一个任意大整数类型。对于Java,您必须找到另一种解决方案

在使用任意大整数算法的语言中,这个问题很简单

print sum(int(x) for x in str(2**1000))
如果你没有这个工具,你必须自己编写乘以2的代码。

在Java中,不能准确地表示2^1000。作为一个浮点数,
Math.pow(21000)
1.0715086071862673E301

要获得所需的结果,请使用保留实际值2^1000的

public static BigInteger sumDigits(BigInteger n) {
    BigInteger num = n;
    BigInteger sum = BigInteger.ZERO;
    BigInteger ten = BigInteger.valueOf(10);
    while (num.compareTo(BigInteger.ZERO) > 0) {
        sum = sum.add(num.mod(ten));
        num = num.divide(ten);
    }
    return sum;
}

public static void main(String[] args) {
    System.out.println(sumDigits(BigInteger.valueOf(2).pow(1000)));
}

上述代码的输出为
1366

,因为您使用的是
双精度
?尝试使用整数类型。但是Math.pow(21000)超出了int类型的范围。您必须使用
biginger