Java 如何更新进度条';s progress(使用0-100个整数)具有长数据类型和整型数据类型?

Java 如何更新进度条';s progress(使用0-100个整数)具有长数据类型和整型数据类型?,java,android,progress-bar,Java,Android,Progress Bar,我正在开发一个非常基本的Android应用程序,我需要更新一个与循环遍历相对应的进度条,以确定输入的数字是否为素数。输入的编号必须是长数据类型。计划是遍历一个从i=2到sqrt(number)的循环,并在每次迭代中将输入的数字除以i。如果我除以这个数,那么循环结束,我们决定它不是素数 否则,循环将继续,同时更新进度。以下是相关代码的片段: protected Void doInBackground(Long... params) { String message; Intent intent =

我正在开发一个非常基本的Android应用程序,我需要更新一个与循环遍历相对应的进度条,以确定输入的数字是否为素数。输入的编号必须是长数据类型。计划是遍历一个从i=2到sqrt(number)的循环,并在每次迭代中将输入的数字除以i。如果我除以这个数,那么循环结束,我们决定它不是素数

否则,循环将继续,同时更新进度。以下是相关代码的片段:

protected Void doInBackground(Long... params) {
String message;
Intent intent = new Intent(MainActivity.this, DisplayMessageActivity.class);

long lim = (long)Math.sqrt(params[0]);

for (int i = 2; i <= lim; i++) {
        if (params[0] % i == 0) {
    message = params[0] + " is not prime!";
    int myProgressFinal = 100;
        publishProgress(myProgressFinal);
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
    return null;
        }
        else {              
            int myProgress = i/lim * 100;
            publishProgress(myProgress);

            if (isCancelled())
                return null;
        }
    }

message = params[0] + " is prime!";
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
return null;
}

}

对于循环,我有一个整数I,表示我在循环中的进展,为了找到我已经前进的百分比,我必须除以循环的最大数量(lim=sqrt(number)),然后乘以100以得到正确的百分比。但是,我不能这样做b/c myProgress是一个整数,但是lim是一个长的,不能更改为int。即使我将lim设置为int,我仍然有整数除法给了我一个错误的值(0*100)。它不允许我将其中一个类型转换为双b/c myProgress必须为int才能通过publishProgress()。有什么建议吗?

首先,如果“i”要一直延伸到lim,那么“i”也需要长一点。否则,一旦“i”命中Integer.MAX_值,下一次迭代将导致溢出

我相信你想宣布我作为一个长,并在你的其他声明做


“int-myProgress=(int)((double)i)/lim)*100)”

我想我算出来了。这有意义吗?(我无法测试它b/c我还没有完成asynctask代码)。无论如何,我输入了整个公式:int myProgress=(int)(I/lim*100);这会不会让我每次都得不到零值?感谢您的时间和洞察力。简单的解决方案是
intmyprogress=(i*100)/lim我在编程arduinoTry时遇到过类似的问题,先将iby 100乘以然后除以lim,例如'myProgress=(I*100)/lim;'我测试了你的理论@bicker和pvyParts,但我仍然无法做到这一点,因为我试图将long转换为int,这是不可能的。基于@fragorl的评论,我决定实际去尝试:)这段代码有效:
int-myProgress=(int)((long)I*100)/lim)当我被声明为int时,但如果我被声明为long(可能应该是),我原始注释中的代码将通过将其转换为int来工作。我尝试对pvyParts的解决方案进行注释,但我的代表不允许我这样做。即使您将i声明为long,首先将其乘以100也可能导致溢出。考虑“LIM”和“I”的长度小于Lim.Max值的情况。将“i”乘以100将远远超过最大值限制。我认为您需要执行类似于“int myProgress=(int)(((double)I)/lim)*100”的操作,但由于lim是Long.MAX_值(最多)的平方根,因此将其乘以100永远不会溢出。
else {              
    int myProgress = i/lim * 100;
    publishProgress(myProgress);