下面的算法可以识别一个较小的因子,但是在使用较大的因子(例如7534534523.0)时会完全失败

double result = 7; // 7534534523.0;

double divisor = 1;

for (int i = 2; i < result; i++){

   double r = result / (double)i;

   if (Math.floor(r) == r){
      divisor = i;
      break;
   }
}


System.out.println(result + "/" + divisor + "=" + (result/divisor));

7534534523.0在计算器上的数字除以2可以得出小数部分或将其四舍五入(丢失0.5)。如何对大量数字执行这种检查?我必须为此使用BigDecimal吗?还是有另一种方法?

最佳答案

我看不到您的代码有什么问题。它的工作原理与应有的一样。
当我运行您的代码时,我得到以下输出:

7.534534523E9/77359.0=97397.0

那可能让您感到困惑,但它完全可以。它只是使用科学的符号,但这没有错。

7.534534523E9 = 7.534534523 * 109 = 7,534,534,523

如果要以普通符号查看它,可以使用System.out.format打印结果:
System.out.format("%.0f/%.0f=%.0f\n", result, divisor, result / divisor);

显示:
7534534523/77359=97397

但是,您不需要double或BigDecimal即可检查一个数字是否可被另一个数字整除。您可以对整数类型使用取模运算符,以检查一个数字是否可被另一个数整除。只要您的数字适合long,它就可以使用,否则您可以继续使用BigInteger:
long result = 7534534523L;
long divisor = 1;
for (int i = 2; i < result; i++) {
    if (result % i == 0) {
        divisor = i;
        break;
    }
}
System.out.println(result + "/" + divisor + "=" + (result / divisor));

10-05 19:35