26

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

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

显然我希望输出是b=0.3,但实际上我得到b=1了。

什么?!为什么会这样?

如果我写:

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

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

这里出了什么问题?

4

5 回答 5

67

您正在使用整数除法。

试试7.0/10吧。

于 2010-05-26T00:30:42.757 回答
29

您在表达式 7/10 中使用了整数,整数 7 除以整数 10 为零。

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

7.0 / 10
7 / 10.0
7.0 / 10.0
7 / (double) 10
于 2010-05-26T00:33:34.803 回答
11

请不要将此作为问题的答案。它不是,而是与利用 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

那是为了证明,如果您认为这是一个错误,那么这个“错误”是一个有用的功能,我们不希望从我们迄今为止使用的任何各种语言中删除它。

于 2010-05-26T06:11:39.770 回答
1

我发现字母标识符更具可读性并且更能指示已解析的类型:

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

或者:

1 - 7d / 10
1 - 7 / 10d
于 2010-05-26T01:46:49.670 回答
1

就我而言,我正在这样做:

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

而不是“正确”:

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

注意括号!

于 2017-01-12T11:01:57.917 回答