Tin*_*iny 5 java floating-point double
以下代码分别使用type float和values的值double.
float a=99999.99F;
double b=a;
System.out.println("a : "+a);
System.out.println("b : "+b);
System.out.println("a==b : "+(a==b));
Run Code Online (Sandbox Code Playgroud)
它显示以下输出:
a : 99999.99
b : 99999.9921875
a==b : true
Run Code Online (Sandbox Code Playgroud)
执行后,值a和b是99999.99和99999.9921875分别,虽然a==b回报true.
比较表达式如何a==b返回true?
在比较的最后一行,在比较之前a==b,值a被隐式提升为double.因此,实际上,正在评估的是(((double)a)==b)当然评估为真的,因为b首先通过铸造a为双重来初始化.
换句话说,最后一个布尔表达式(a==b)询问:
是(某些浮点值转换为double)==(相同的浮点值转换为其他地方的double)
答案是:是的.
更新:下面的评论者提出了一个很好的观点:当a提升为双倍时,存储的数值实际上不会改变,即使它出现因为打印了不同的值.问题在于如何存储浮点数; 没有做出这个答案WAAAY太长并且涉及过去我的深度,你需要知道的是,一些简单的十进制值不能以二进制浮点形式完美地表示,无论你有多少位数(就像你不能完美表示1/3在基数10中没有无限数量的3,如0.333333 ...),所以当你使用float(浮点数的32位表示)分配其中一个值然后你将它转换为double(一个64位的表示)然后使用println 要显示该数字的值,您可能会看到更多数字.
该println方法显示最短的十进制数字串,转换为计算机内部看到的相同浮点(或双精度)值.虽然println在您的示例中前两个调用中将相同的数值作为参数传递,但该double类型具有更高的精度,因此println需要打印更多数字以显示"将转换为的最短十进制数字串(double)99999.99F".如果您的示例是9999.50,则两个数字都打印相同,因为二进制数字可以表示1/2正常.
注意:我甚至不接近浮点数专家; 你应该查看(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html),如果你想更深入地了解这里发生了什么.