首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中数字/10和编号*0.1之间的差异

java中数字/10和编号*0.1之间的差异
EN

Stack Overflow用户
提问于 2014-12-28 20:23:22
回答 2查看 841关注 0票数 0

我在面试问题上已经做了1.5小时了,但在我的Java程序中找不到这个bug。然后我发现了问题所在,我不明白(不要注意价值观,还有其他问题,是关于类型的):

代码语言:javascript
复制
int size=100;
Integer a=12;
if(a >= size/10)...
//didn't work

是不同于

代码语言:javascript
复制
if(a >= size*0.1)...
//worked

我知道有一个转换,但是如果(a>=size/10)返回false,那么使用a=12怎么可能呢?

为什么会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-28 20:25:30

/10是整数除法。而*0.1首先将第一个操作数转换为double,并执行浮点乘法。

如果您使用/10,而操作数是14,它将导致1 --实际上是14/10=1.4 --但是整数除法会将其归结为整数除法。因此,29/10=2.

如果您使用*0.1,Java编译器将首先将size的值转换为double,从而14.0,然后将其与0.1复合,从而生成1.4

另一方面,浮点数产生的并不全是比提。floatdouble不能表示每一个整数,计算后舍入。

但是,对于给定的size值,它将产生效果,因为10010的倍数,而floatdouble能够表示从0到100之间的任何整数值。

最后,/10并不总是整数除法:如果第一个操作数是浮点数(例如14.0d/10),编译器将把它转换为浮点除法。

简写版:

  • int/int是一个整数除法,舍入到最近(下)的整数。
  • int*double是一种双乘法,它与舍入误差一起导致浮点值,最接近正确的结果(用十进制数字)。
票数 5
EN

Stack Overflow用户

发布于 2014-12-28 20:35:21

我刚在这里测试过:

代码语言:javascript
复制
public class a {
  public static void main(String[] args) {
    int size = 100;
    int a = 12;

    System.out.println((a >= size / 10) ? "OK" : "Failed?");
  }
}

而且起作用了。我不认为这是你真正的问题。可能在代码的另一部分。

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

https://stackoverflow.com/questions/27680271

复制
相关文章

相似问题

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