在 Java 中除以整数会产生不正确的值 2147483
Posted
技术标签:
【中文标题】在 Java 中除以整数会产生不正确的值 2147483【英文标题】:Division by integer in Java yields incorrect value of 2147483 【发布时间】:2018-06-10 17:36:43 【问题描述】:这是我调用的方法来计算 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?
提前致谢!
【问题讨论】:
当它给出2147483
时你知道输入吗?
你的代码很长,要写MeanSampleSize = (int) Stream.of(R).mapToDouble(ResultData::getTotal).average().getAsDouble();
可能值得注意的是= (int) temp/R.length
是= ((int)temp) / R.length
(整数除法),而不是= (int)(temp / R.length)
(双除法将结果截断为int
)。这可能不是问题,但似乎值得举报。
如果temp
大于Integer.MAX_VALUE
,(int) temp
将导致Integer.MAX_VALUE
。
接受@Radiodef 的评论:...除以 1000(整数除法)是...2147483!所以,我上面的“这可能不是问题......”是错误的。 是的问题。
【参考方案1】:
您在 double
中累积您的总数,然后执行以下操作:
MeanSampleSize = (int) temp/R.length;
这是
MeanSampleSize = ((int) temp)/R.length;
正如 Radiodef 所说,如果temp
的值大于Integer.MAX_VALUE
,则(int)temp
将是Integer.MAX_VALUE
(2147483647),除以1000(整数除法)时是... 2147483。
您可能想先除法(作为双精度数),然后截断为 int:
MeanSampleSize = (int) (temp / R.length);
然而,值得注意的是各种 cmets,除非 getTotal
返回 double
并且您希望这些小数值累积,否则使用 double
执行此操作可能不是您的最佳选择。但可能值得使用long
(并如上所述调整您的括号)。
【讨论】:
以上是关于在 Java 中除以整数会产生不正确的值 2147483的主要内容,如果未能解决你的问题,请参考以下文章
为啥整数除以零 1/0 会出错但浮点数 1/0.0 返回“Inf”?