已解决求助:变量转换
提问者:很纯洁嘛 | 浏览次 | 提问时间:2017-02-10 | 回答数量:9
double db = (double)(5/2);System.out.println(db);复制代码结果:2请问如何理解这个转换过程,谢谢!
已有9条答案
说的专业点的话 解释如下:
Java语言中的float,double类型 都是依照IEEE754标准来进行对数值的转换的!
至于什么叫IEEE754标准 这个标准又是什么样子的 可以去查下资料 在这就不过多的介绍了!!
此问题 出现的是一个误区 在java中存在着一种舍入的方式,和我们现实当中的四舍五入不一样!!
IEEE754标准不支持四舍五入的模式!!只支持以下几种舍入模式
1)向最接近的可表示的值;
2)当有两个最接近的可表示的值时首选“偶数”值;
3)向负无穷大(向 下);
4)向正无穷大(向上)以及向0(截断)
在java IEEE标准中采取的默认模式是最近舍入方式 对于0.5这样的数字,采用取偶数的方式
原因是:
由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。在两个可以精确表示的相邻浮点数之间,必定存在无穷多实数是IEEE浮点数所无法精确表示的。如何用浮点数表示这些数,IEEE 754的方法是用距离该实数最近的浮点数来近似表示。
对于此问题的 0.5的数字偏向1也不是偏向0也不合适,在计算机内部的运行全都是加法来运行的,乘法 除法 减法 都要转换成加法来进行运行的,因此就涉及到负数的 原码、反码、补码、移码
问题,以及涉及到了带有符号位的二进制计算的问题,此类型在内部都是以补码的方式进行处理的 而不是以原码和反码运行的,因为带有符号位 计算机处理起来不方便,所以只能通过补码的形式来计算
这样一方面使符号位能与有效值部分一起参加运算,从而简化运算规则. 另一方面使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计,具体的可以参考下补码的转化过程!
5/2结果是取整
5除以2商2余1,取整,当然就得2咯
但是得出的2是int型变量,然后将其强制转换成double型的
double型与int型的区别就在于内存中所占位数不同,在不超过两者取值的范围类,机器显示出的结果是一样的,所以你的运行显示结果就是2(double型)
疯起来要不得丶
回答数:107 | 被采纳数:147
结果是 2.0 呵呵!!!
不是吧?人家给的结果都是2,我解答的没错吧?应该没有误人子弟吧?
不相信你自己可以运行下看看
那如果 换成是这样的话 你觉得又应该输出什么值
double db = (double)(5.2/2);
System.out.println(db);
如果按照你的解释的话 5.2 / 2 是取整数部分 得到个2 输出double型的2咯
你运行下看看是不是 跟你所想的一样!
算了neo_pang 我看出来我错了,我很惭愧!我没有运行就发言了,楼主,对不起!另外楼主你也误导了我,你不应该说输出的是2,我想当然的认为你说的是正确的了。
那你又认为 如何去解答这个问题!!
我只知道是内部中 带二进制的数值 转换成补码 运行而执行出的返回值!
根据IEEE标准的默认舍取方式 最终出现的2.0结果!!
更详细的原理解释 我不是很清楚 你能告诉我下吗!
回7楼:我更不清楚!你太谦虚了,不过我可以给你推荐几个网站,上面有很多Java高手,他们应该会知道,网站:
http://www.j2medev/
http://www.bc-cn/index.html
http://www.java-cn/
break31
回答数:118 | 被采纳数:82
因为5和2是整数,所以5/2也是整数,所以显示2,如果想显示小数必须把5和2中其中一个用小数表示,如5.0/2