System.out.println(1000*16777216/4890);
输出: -82342
......但应该是:3430923
我该如何解决这个问题?
答案 0 :(得分:4)
只需将"go."
添加到L
或1000
(或两者)......这样就可以了。
原因,就像Rod_Algonquin所述,它是整数值的正溢出,当你将16777216
乘以{时,它就会发生{1}};最终将大于(允许的最大值)1000
,因此它会结束并从16777216
开始(在您的情况下,值为Integer.MAX_VALUE
;除以Integer.MIN_VALUE
你会得到意想不到的结果-402653184
。
看看(注意黄色突出显示的部分; IDEA会用表达式中的数字溢出警告你):
答案 1 :(得分:1)
正如@Rod_Algonquin所指出的,1000*16777216
超过int
的{{3}}(int
取值-2 31 至2 31 - 1),因此导致溢出。
为了防止发生溢出,您可以使用long
执行计算,方法是在数字文字之后添加字母L
,如下所示:
1000L * 16777216 / 4890
默认情况下,1000
是Java中的int
字面值,而1000L
是long
字面值。
答案 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
作为浮点值。