首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中的简单除法--这是一个bug还是一个特性?

Java中的简单除法--这是一个bug还是一个特性?
EN

Stack Overflow用户
提问于 2010-05-26 08:29:53
回答 5查看 197.4K关注 0票数 26

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

代码语言:javascript
复制
System.out.println("b=" + (1 - 7 / 10));

显然,我期望输出为b=0.3,但实际上我得到的是b=1

什么?!这一切为什么要发生?

如果我写道:

代码语言:javascript
复制
System.out.println("b=" + (1 - 0.7));

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

这里出了什么问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-26 08:30:43

你使用的是整数除法。

请尝试使用7.0/10

票数 67
EN

Stack Overflow用户

发布于 2010-05-26 08:33:35

您已经在表达式7/10中使用了整数,整数7除以整数10等于零。

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

代码语言:javascript
复制
7.0 / 10
7 / 10.0
7.0 / 10.0
7 / (double) 10
票数 29
EN

Stack Overflow用户

发布于 2010-05-26 14:11:40

请不要将此视为对该问题的回答。它不是,而是一个关于利用int和float的差异的建议。如果答案框不允许我格式化这条评论,我会把它放在评论下面。

自从fortran (或更早的)时代以来,这个特性已经在每一种受人尊敬的编程语言中使用-我必须承认我曾经是一名Fortran和Cobol穿孔卡片程序员。

例如,10/3的整数除法得到整数值3,因为整数没有保存分数残差.3333的设施。。

我们(古老的程序员)使用这个特性的方法之一就是循环控制。

假设我们希望打印一个包含1000个字符串的数组,但是我们希望在每第15个字符串之后插入一个换行符,以便在行尾和下一行的开头插入一些漂亮的字符。我们利用这一点,给定整数k是字符串在该数组中的位置。

代码语言:javascript
复制
int(k/15)*15 == k

只有当k可被15整除时才为真,这种情况出现在每15个单元的频率上。这类似于我的朋友说他的祖父的死表一天两次准确。

代码语言:javascript
复制
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

因此,循环,

代码语言:javascript
复制
leftPrettyfy();
for(int k=0; k<sa.length; k++){
  print(sa[k]);
  int z = k + 1;
  if ((z/15)*15 == z){
    rightPrettyfy();
    leftPrettyfy();
  }
}

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

代码语言:javascript
复制
1
2  3
4  5  6
7  8  9  10
11 12 13 14 15

这是为了证明,如果你认为这是一个bug,这个"bug“是一个有用的功能,我们不希望从我们到目前为止使用的任何语言中删除它。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2909451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档