Java中的简单划分 – 这是一个错误还是一个function?

我正在Java应用程序中尝试这个简单的计算:

System.out.println("b=" + (1 - 7/10)); 

显然我想要输出b=0.3 ,但这是我得到的b=1

什么?! 为什么会这样?

如果我做:

 System.out.println("b=" + (1 - 0.7)); 

我得到了正确的结果,即b=0.3

这里出了什么问题?

你正在使用整数除法。

请尝试使用7.0/10

你在表达式7/10中使用了整数,整数7除以整数10就是零。

你期待的是浮点除法。 以下任何一种都会评估您的预期方式:

 7.0 / 10 7 / 10.0 7.0 / 10.0 7 / (double) 10 

请不要将此作为问题的答案。 它不是,而是与利用int和float的差异相关的建议。 我会把它放在评论之外,但答案框允许我格式化这个评论。

自fortran(或更早)的日子以来,这个function已被用于各种可敬的编程语言中 – 我必须承认我曾经是Fortran和Cobol打卡程序员。

例如,10/3的整数除法产生整数值3,因为整数不具有保持小数残差的function.3333 ..

我们(古代古代程序员)使用此function的方法之一是循环控制。

假设我们希望打印一个包含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 

通过在循环中以奇特的方式改变k,我们可以打印出三角形打印输出

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

这是为了certificate,如果你认为这是一个错误,这个“ 错误 ”是一个有用的function,我们不希望从我们迄今使用的任何语言中删除。

我发现字母标识符更易读,更能说明解析后的类型:

 1 - 7f / 10 1 - 7 / 10f 

要么:

 1 - 7d / 10 1 - 7 / 10d 

就我而言,我这样做:

 double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1)); 

而不是“正确”:

 double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1); 

请注意括号!