我正在Java应用程序中尝试这个简单的计算:
System.out.println("b=" + (1 - 7 / 10));
显然我希望输出为b=0.3
,但实际上我得到了b=1
。
什么?为什么会这样?
如果我写:
System.out.println("b=" + (1 - 0.7));
我得到了正确的结果,即b=0.3
。
这里出了什么问题?
答案 0 :(得分:58)
你正在使用整数除法。
请尝试7.0/10
。
答案 1 :(得分:24)
你在表达式7/10中使用了整数,整数7除以整数10是零。
你期待的是浮点除法。以下任何一种都会评估您的预期方式:
7.0 / 10
7 / 10.0
7.0 / 10.0
7 / (double) 10
答案 2 :(得分:9)
请不要将此作为问题的答案。它不是,而是与利用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 ”是一个有用的功能,我们不希望从我们使用的任何一种语言中删除远。
答案 3 :(得分:1)
我发现字母标识符更易读,更能说明解析后的类型:
1 - 7f / 10
1 - 7 / 10f
或:
1 - 7d / 10
1 - 7 / 10d
答案 4 :(得分:0)
就我而言,我这样做:
double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));
而不是&#34;正确&#34; :
double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);
注意括号!