为什么" x * y / z"导致负值不正确?

时间:2015-05-01 02:37:29

标签: java math

System.out.println(1000*16777216/4890);

输出: -82342

......但应该是:3430923

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

只需将"go."添加到L1000(或两者)......这样就可以了。

原因,就像Rod_Algonquin所述,它是整数值的正溢出,当你将16777216乘以{时,它就会发生{1}};最终将大于(允许的最大值)1000,因此它会结束并从16777216开始(在您的情况下,值为Integer.MAX_VALUE;除以Integer.MIN_VALUE你会得到意想不到的结果-402653184

看看(注意黄色突出显示的部分; IDEA会用表达式中的数字溢出警告你):

enter image description here

答案 1 :(得分:1)

正如@Rod_Algonquin所指出的,1000*16777216超过int的{​​{3}}(int取值-2 31 至2 31 - 1),因此导致溢出。

为了防止发生溢出,您可以使用long执行计算,方法是在数字文字之后添加字母L,如下所示:

1000L * 16777216 / 4890

默认情况下,1000是Java中的int字面值,而1000Llong字面值。

答案 2 :(得分:1)

首先要注意它的整数算术。无论中间计算是什么,都存储为整数。 var a = 1; function add() { var fContent = document.getElementById('1'); var sContent = document.getElementById('2'); if (a <= 10) { a++; var objTo = document.getElementById('m'); var divtest = document.createElement("div"); divtest.innerHTML = (sContent.innerHTML + a + fContent.innerHTML); objTo.appendChild(divtest); } } 将提供超出整数范围的1000*16777216。 所以现在系统尝试在运行时期间通过流管理这个整数。如16777216000 16777216000 >现在它移动负范围值来处理溢出..

尝试这样Integer.MAX_VALUE将为您提供Integer.MAX_VALUE + 1。更好的方法是使用-2147483648原语,或者您可以使用long作为浮点值。