如何阻止Java舍入我的数字,以便我可以解决问题3

时间:2013-05-11 08:47:04

标签: java rounding

所以我最近一直在做一些Project Euler,但由于某些原因,我的代码无法正常工作,因为Java一直在完善我的divsions。

public class Problem3 {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    double max = 0;
    double n = 600851475431.;

    for (double i = 2; i<Math.sqrt(n); i++){
        if (600851475431.%i == 0){
            if (isPrime (i) == true && i>max){
                max = i;
            }
        }
    }
    System.out.print(max);

}

public static boolean isPrime(double a){
    for (int i= 2; i<Math.sqrt(a); i++){
        if (a%i == 0){
            return false;
        }
    }
    return true;
}

首先,600851475431%168887不等于0,但Java一直认为它确实如此。

2 个答案:

答案 0 :(得分:1)

提示:如果您需要大于2^31 - 1的精确数字表示,请使用long。如果您需要大于2^64 - 1的准确数字表示,请使用BigInteger

600851475431介于2^392^41之间。

我会让你得出结论。

修改
另一个提示:if (600851475431.%i == 0){
请注意.。这会强制将数字表示为double。您的变量n中包含显式定义的类型。使用它。

答案 1 :(得分:1)

实际上,Java是对的

  $ dc
    600851475431
    168887
    /
    p
    3557713
    168887
    *
    p
    600851475431
    ^D
  $

由于3557713 * 168887完全是600851475431600851475431 % 168887为零。