我在一个Java应用程序中尝试这个简单的计算:
System.out.println("b=" + (1 - 7 / 10));
显然,我期望输出为b=0.3
,但实际上我得到的是b=1
。
什么?!这一切为什么要发生?
如果我写道:
System.out.println("b=" + (1 - 0.7));
我得到了正确的结果,即b=0.3
。
这里出了什么问题?
发布于 2010-05-26 08:30:43
你使用的是整数除法。
请尝试使用7.0/10
。
发布于 2010-05-26 08:33:35
您已经在表达式7/10中使用了整数,整数7除以整数10等于零。
你所期望的是浮点除法。以下任何一项都会以您预期的方式进行评估:
7.0 / 10
7 / 10.0
7.0 / 10.0
7 / (double) 10
发布于 2010-05-26 14:11:40
请不要将此视为对该问题的回答。它不是,而是一个关于利用int和float的差异的建议。如果答案框不允许我格式化这条评论,我会把它放在评论下面。
自从fortran (或更早的)时代以来,这个特性已经在每一种受人尊敬的编程语言中使用-我必须承认我曾经是一名Fortran和Cobol穿孔卡片程序员。
例如,10/3的整数除法得到整数值3,因为整数没有保存分数残差.3333的设施。。
我们(古老的程序员)使用这个特性的方法之一就是循环控制。
假设我们希望打印一个包含1000个字符串的数组,但是我们希望在每第15个字符串之后插入一个换行符,以便在行尾和下一行的开头插入一些漂亮的字符。我们利用这一点,给定整数k是字符串在该数组中的位置。
int(k/15)*15 == k
只有当k可被15整除时才为真,这种情况出现在每15个单元的频率上。这类似于我的朋友说他的祖父的死表一天两次准确。
int(1/15) = 0 -> int(1/15)*15 = 0
int(2/15) = 0 -> int(2/15)*15 = 0
...
int(14/15) = 0 -> int(14/15)*15 = 0
int(15/15) = 1 -> int(15/15)*15 = 15
int(16/15) = 1 -> int(16/15)*15 = 15
int(17/15) = 1 -> int(17/15)*15 = 15
...
int(29/15) = 1 -> int(29/15)*15 = 15
int(30/15) = 2 -> int(30/15)*15 = 30
因此,循环,
leftPrettyfy();
for(int k=0; k<sa.length; k++){
print(sa[k]);
int z = k + 1;
if ((z/15)*15 == z){
rightPrettyfy();
leftPrettyfy();
}
}
通过在循环中以一种奇特的方式改变k,我们可以打印一个三角形打印输出
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
这是为了证明,如果你认为这是一个bug,这个"bug“是一个有用的功能,我们不希望从我们到目前为止使用的任何语言中删除它。
https://stackoverflow.com/questions/2909451
复制相似问题