急求 java 基础问题 拜托各位了,在下先谢谢了!!
public class Conversion{
public static void main (String[] args)
{
float f;
double d=123456789.123456789;
f=(float)d;
System.out.println("f= "+f);
System.out.println("d= "+d);
}
}
运行结果如下:
f= 1.23456792E8
d= 1.2345678912345679E8
f= 1.23456792E8 E前面的2是什么意思 为什么不是f= 1.23456789E8
d= 1.2345678912345679E8 E前面的9是8后面的9四舍五入得到的吗
还有:java2实用教程中对于实型float型变量内存分配4个字节 占32位,float型变量的取值范围是1E-38―1E+38和
-1E-38― -1E38
double型变量内存分配8个字节 占64位,double型变量的取值范围是1E-308―1E+308和
-1E-308― -1E308 这些数值是怎么得到的啊,一直研究不明白!!!
希望各位能抽出一点时间给我个解答,在下感激不尽!!!
[此贴子已经被作者于2007-9-19 9:58:16编辑过]
----------------解决方案--------------------------------------------------------
E代表*10的几次方,例如,1.23E3=1.23*10*10*10=1230
----------------解决方案--------------------------------------------------------
回复:(hwoarangzk)E代表*10的几次方,例如,1.23E3=...
这我知道啊!不明白的是强制转换运算后得到的结果 是怎么弄出来的,和现实计算的不一样啊 ----------------解决方案--------------------------------------------------------
我记得好像double类型的,像你这么长的数会自动保留小数点后16位,之后的会四舍五入,float的则是后8位
----------------解决方案--------------------------------------------------------
回复:(hwoarangzk)我记得好像double类型的,像你这...
那样的话f= 1.23456789E8也就符合了嘛,但是编译结果不是他啊!
----------------解决方案--------------------------------------------------------
double d=123456788.123456789//个位数是8,9的结果是第一个f
f= 1.23456792E8
double d=123456780.123456789//个位数是0--7的结果是第二个f
f= 1.23456784E8
从来没遇到过,也没好好想过,奇怪...
----------------解决方案--------------------------------------------------------
以下是引用hwoarangzk在2007-9-19 10:24:14的发言:
double d=123456788.123456789//个位数是8,9的结果是第一个f
f= 1.23456792E8
double d=123456780.123456789//个位数是0--7的结果是第二个f
f= 1.23456784E8
从来没遇到过,也没好好想过,奇怪...
double d=123456788.123456789//个位数是8,9的结果是第一个f
f= 1.23456792E8
double d=123456780.123456789//个位数是0--7的结果是第二个f
f= 1.23456784E8
从来没遇到过,也没好好想过,奇怪...
呵呵,这可是书上的原题啊,老师讲课的时候一笔带过,没有问出结果,只好来求助了!
是啊,但是为什么啊!!
谢谢啊!!
----------------解决方案--------------------------------------------------------
问了下公司的同事,长数据转短数据时会丢失一些数据,估计是丢失在某一范围的时候,得到的float是一个固定的数,丢失在另一范围的时候,又得到一个固定的数。我把小数部分全去掉了,还是一样的结果。应该是个位数决定这个丢失的部分在哪一个范围,然后得到的float就根据丢失的范围来得到新的数。64位转32位,算起来貌似很麻烦的样子...
----------------解决方案--------------------------------------------------------
以下是引用hwoarangzk在2007-9-19 10:59:44的发言:
问了下公司的同事,长数据转短数据时会丢失一些数据,估计是丢失在某一范围的时候,得到的float是一个固定的数,丢失在另一范围的时候,又得到一个固定的数。我把小数部分全去掉了,还是一样的结果。应该是个位数决定这个丢失的部分在哪一个范围,然后得到的float就根据丢失的范围来得到新的数。64位转32位,算起来貌似很麻烦的样子...
问了下公司的同事,长数据转短数据时会丢失一些数据,估计是丢失在某一范围的时候,得到的float是一个固定的数,丢失在另一范围的时候,又得到一个固定的数。我把小数部分全去掉了,还是一样的结果。应该是个位数决定这个丢失的部分在哪一个范围,然后得到的float就根据丢失的范围来得到新的数。64位转32位,算起来貌似很麻烦的样子...
谢谢你半天以来的帮助,能否告诉我 他们的取值范围是怎么回事吗!
非常感谢!!!
----------------解决方案--------------------------------------------------------
就用float型举例,假设一个32位的float,最高位是符号位,记为s,假设剩余的31位中,11位用来表示整型,记为c,其余20位用来表示浮点,记为f
整个32位的float型变量计算公式如下:
(-1)^s*2^(s-1023)*(1+f) //关键是浮点数的计算公式
例如:
01111111111100000000000000000000
则s = 0;
c = 2^10+2^9+……+2^0 = 2047
f = 0; //为方便起见,这里的f全取0
则其表示的值为:
(-1)^0 * 2^(2047-1023)*(1+0) = 1 * 2^1024*1 = 2^1024
上面举例中的用11位表示整数和20位表示浮点数,是我大概为了说明如何计算的,至于实际中用几位来分别表示整数和浮点,请参考IEEE标准。
参考资料:数值分析
百度找到的,你先看看吧
----------------解决方案--------------------------------------------------------