【问题标题】:Division by integer in Java yields incorrect value of 2147483在 Java 中除以整数会产生不正确的值 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!所以,我上面的“这可能不是问题......”是错误的。 的问题。

标签: java integer-division


【解决方案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(并如上所述调整您的括号)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多