在 Java 中除以整数得到不正确的值 2147483
Division by integer in Java yields incorrect value of 2147483
这是我调用的方法,主要用于计算 1000 个整数的平均值:
public void setMeanSampleSize(ResultData[] R) {
double temp = 0;
for(int i = 0;i < R.length;i++){
temp = temp + R[i].getTotal();
}
MeanSampleSize = (int) temp/R.length;
}
作为 ResultData 对象一部分的变量 Total 是一个整数。
在 99.99% 的情况下,这可以正常工作,但在一些奇怪的情况下,代码会为 MeanSampleSize 产生错误的结果 2147483(与 32 位整数最大值 2,147,483,647 惊人地相似)。
谁能帮助理解为什么这个除法有时会起作用而在其他情况下给出完全错误的结果 2147483?
提前致谢!
您正在 double
中累积您的总数,然后这样做:
MeanSampleSize = (int) temp/R.length;
也就是
MeanSampleSize = ((int) temp)/R.length;
正如Radiodef所说,如果temp
的值大于Integer.MAX_VALUE
,(int)temp
将是Integer.MAX_VALUE
(2147483647),除以1000(用整数除法)是... 2147483.
您可能想先除法(作为双精度数),然后截断为整数:
MeanSampleSize = (int) (temp / R.length);
不过,值得注意的是各种评论,使用 double
执行此操作可能不是您的最佳选择,除非 getTotal
returns a double
并且您想要那些要累积的小数值。但可能值得使用 long
(并如上所述调整 parens)。
这是我调用的方法,主要用于计算 1000 个整数的平均值:
public void setMeanSampleSize(ResultData[] R) {
double temp = 0;
for(int i = 0;i < R.length;i++){
temp = temp + R[i].getTotal();
}
MeanSampleSize = (int) temp/R.length;
}
作为 ResultData 对象一部分的变量 Total 是一个整数。
在 99.99% 的情况下,这可以正常工作,但在一些奇怪的情况下,代码会为 MeanSampleSize 产生错误的结果 2147483(与 32 位整数最大值 2,147,483,647 惊人地相似)。
谁能帮助理解为什么这个除法有时会起作用而在其他情况下给出完全错误的结果 2147483?
提前致谢!
您正在 double
中累积您的总数,然后这样做:
MeanSampleSize = (int) temp/R.length;
也就是
MeanSampleSize = ((int) temp)/R.length;
正如Radiodef所说,如果temp
的值大于Integer.MAX_VALUE
,(int)temp
将是Integer.MAX_VALUE
(2147483647),除以1000(用整数除法)是... 2147483.
您可能想先除法(作为双精度数),然后截断为整数:
MeanSampleSize = (int) (temp / R.length);
不过,值得注意的是各种评论,使用 double
执行此操作可能不是您的最佳选择,除非 getTotal
returns a double
并且您想要那些要累积的小数值。但可能值得使用 long
(并如上所述调整 parens)。