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检查数字之间的差异的十进制之后是否有一个范围,如果是,那该范围是什么以及为什么?
答案 0 :(得分:2)
如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第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
的值也由相同的操作序列产生;往上看。 (只是float
到double
促销发生在代码的不同位置。)
通过相同的推理......在d - f
中,f
将在被减去之前被提升,并且您将从自身中减去一个值。
注意:"促销的技术上正确的Java术语"我所说的是原始扩展转换"。但这有点拗口。
答案 2 :(得分:1)
没有范围检查。减法和比较中使用的值相等。
原因如下:
10/3.0f
会给出一个浮动(3.3333333
)。3.3333333
转换为加倍(3.3333332538604736
)的值。f
(3.3333333
)转换为double(3.3333332538604736
),因此值相等。答案 3 :(得分:-1)
您在此处观察到的问题在此post中有更详细的描述。
核心"问题"这就是这一行:
double d= 10/3.0f;
您实际上将float
投放到double
。如果您将其更改为
double d= 10/3.0d;
你得到了你可能一直在寻找的结果。