值的差异仍然得到==比较为真

时间:2018-02-14 12:12:54

标签: java

double d= 10/3.0f;   // returns 3.3333332538604736;
float f= 10/3.0f;    // returns 3.3333333;
System.out.println(d-f);  //returns 0  ;
System.out.println(d==f);  //returns true;
  

在jvm检查数字之间的差异的十进制之后是否有一个范围,如果是,那该范围是什么以及为什么?

4 个答案:

答案 0 :(得分:2)

根据JLS Section 15.21.1

  

如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)是数字类型,则对操作数执行二进制数字提升(第5.6.2节) )。

这意味着在进行实际比较之前,表达式f中的f==d将转换为double

因此,在3.3333333变为双精度后,变为3.3333332538604736,与d相同。

答案 1 :(得分:2)

理解为什么没有区别的关键是理解它的作用:

double d = 10 / 3.0f;

首先,10被提升为10.0f

接下来,评估表达式10.0f / 3.0f以提供float值。

最后,float值会提升为double,然后分配给d

简而言之,10 / 3.0f正在使用float算术并生成float值。事实上,同样的事情发生在这里:

float f = 10 / 3.0f;

除了我们将促销转移到double

现在:

System.out.println(d == f);

这里发生的事情是f被提升为double,然后将该值与d进行比较。

而且......他们是一样的。

因为d的值由相同的操作序列产生;往上看。 (只是floatdouble促销发生在代码的不同位置。)

通过相同的推理......在d - f中,f将在被减去之前被提升,并且您将从自身中减去一个值。

注意:"促销的技术上正确的Java术语"我所说的是原始扩展转换"。但这有点拗口。

答案 2 :(得分:1)

没有范围检查。减法和比较中使用的值相等。

原因如下:

  • Java在使用运算符时将值转换为相同的类型。在这两种情况下,它都会将float转换为double。
  • 10/3.0f会给出一个浮动(3.3333333)。
  • d将包含将浮动3.3333333转换为加倍(3.3333332538604736)的值。
  • 在减去或比较之前,Java会将float f3.3333333)转换为double(3.3333332538604736),因此值相等。

答案 3 :(得分:-1)

您在此处观察到的问题在此post中有更详细的描述。

核心"问题"这就是这一行:

double d= 10/3.0f;

您实际上将float投放到double。如果您将其更改为

double d= 10/3.0d;

你得到了你可能一直在寻找的结果。