在 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的主要内容,如果未能解决你的问题,请参考以下文章

将两个整数的乘积除以它们的 gcd 的结果不正确

如何在 Oracle SQL 中将整数除以产生浮点数?

为啥整数除以零 1/0 会出错但浮点数 1/0.0 返回“Inf”?

分配给整数时的字符串数组会产生一个奇怪的值[重复]

为什么整数除以零1/0会给出错误,但浮点1 / 0.0会返回“Inf”?

在java中的double和float类型数据相除为啥可以除以零