刚才有个人问了个问题
把我的欲望勾起来了,但是问题还没解决呢,就结了
我开个帖继续问。
主 题: 菜鸟基础问题2
作 者: hihicapcom (hihicapcom) double x=1/(1.0/0);pass;result:0.0
float x=1/(1.0/0);error;reason:float x=1/(float)(1.0/0);pass;result:0.0but
double x=1.0/0 infinity why?
float x=1/0 error why?
int x=1/0 error why?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复人: believefym(暮色,miss,迷失,miss) ( ) 信誉:100 2005-11-10 9:44:47 得分: 20 double、float存的都是不精确的数,0不是真正 的0,也许是0.0000000002,有微小的误差,所以除一下就很大一个数了,int的0就是0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复人: 007JavaKing(猛将兄) ( ) 信誉:95 2005-11-10 9:48:16 得分: 30 “double x=1.0/0 infinity why?”
/0 这个0应该是整的吧,是不是返回double就把0当double看?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复人: ypdarling(冲动是魔鬼!) ( ) 信誉:100 2005-11-10 10:23:00 得分: 0 believefym(暮色,miss,迷失,miss)
说得有点不对吧,double、float存的虽然都是不精确的数
但是0就是0.0,是比较精确的,float x=0;
System.out.println(x);输出的结果是0.0
而不是什么0.0000000002而且虽然0.0000000002很小,但是1.0/0.0000000002也不会得到无穷大,挺多是溢出。我也不太明白,关注中
把我的欲望勾起来了,但是问题还没解决呢,就结了
我开个帖继续问。
主 题: 菜鸟基础问题2
作 者: hihicapcom (hihicapcom) double x=1/(1.0/0);pass;result:0.0
float x=1/(1.0/0);error;reason:float x=1/(float)(1.0/0);pass;result:0.0but
double x=1.0/0 infinity why?
float x=1/0 error why?
int x=1/0 error why?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复人: believefym(暮色,miss,迷失,miss) ( ) 信誉:100 2005-11-10 9:44:47 得分: 20 double、float存的都是不精确的数,0不是真正 的0,也许是0.0000000002,有微小的误差,所以除一下就很大一个数了,int的0就是0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复人: 007JavaKing(猛将兄) ( ) 信誉:95 2005-11-10 9:48:16 得分: 30 “double x=1.0/0 infinity why?”
/0 这个0应该是整的吧,是不是返回double就把0当double看?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复人: ypdarling(冲动是魔鬼!) ( ) 信誉:100 2005-11-10 10:23:00 得分: 0 believefym(暮色,miss,迷失,miss)
说得有点不对吧,double、float存的虽然都是不精确的数
但是0就是0.0,是比较精确的,float x=0;
System.out.println(x);输出的结果是0.0
而不是什么0.0000000002而且虽然0.0000000002很小,但是1.0/0.0000000002也不会得到无穷大,挺多是溢出。我也不太明白,关注中
float f=0.0f;给你个程序,你运行一下看看:
float f=0.0f;System.out.println(f);//看看初值
for(int i=0;i<10;i++){
f+=0.1f;
System.out.println(f);//看看每次的结果
}
你会发现加到第七次,就已经产生5.0E-8的误差,第十次1.0E-7,float不存在0这个值。
float范围:负数:-3.4E38到-1.4E-45
正数:1.4E-45到3.4E38 double x=1.0/0 infinity why?与上面一样。 float x=1/0 error why?
int x=1/0 error why?这两个本身就错整数是有0这个值的,除数不能为0的。
0不是真正的0,存在微小的误差的
我知道float是不精确的,你的代码正好可以证明
但是不精确不能说明float没有0值float x=0;
System.out.println(x);
输出的结果是0.0
你又如何解释呢?float x=1/(1.0/0)错误;我知道原因,因为不能将double型赋给float。
但是float x=1/(float)(1.0/0);为什么就通过了呢?
1/(float)(1.0/0)的结果也应该是一个double型,怎么就能赋过去了呢?还有我想问double x=1.0/0;这句是如何运作的?
我知道这里的0会首先转成double型的,但是它也应该是0呀,
如果是非0的话,一个数除以一个非0值不可能得到无穷大呀?
我们就当它是0.0000000000000000000000000000000000000000000000000000001吧
那么为什么
float x=0;
System.out.println(x);
输出的结果是0.0,而不是0.0000000000000000000000000000000000000000000000000000001呢?而且1.0/0.0000000000000000000000000000000000000000000000000000001即使这个数非常小,但是也是一个确定的数呀,结果也不应该是无穷大吧。
System.out.println(x);
输出的结果是0.0
你又如何解释呢?因为它有误差啊,误差是达到一个数值以后才会表现出来。但是float x=1/(float)(1.0/0);为什么就通过了呢?
这有个自动类型转换的问题。1/(float)(1.0/0)由于自动类型转换,结果会是float型。还有我想问double x=1.0/0;这句是如何运作的?
我知道这里的0会首先转成double型的,但是它也应该是0呀,
如果是非0的话,一个数除以一个非0值不可能得到无穷大呀?
因为这个0是有误差的,而且极小,一个数除以0.0后,理论上不是无穷大的,但是这个结果已经超出了java中允许的最大数,所以就会显示Infinity。
System.out.println(x);
输出的结果是0.0
你又如何解释呢?因为它有误差啊,误差是达到一个数值以后才会表现出来。
这个是不是就是说:虽然上面的那个x被println的结果是0.0,但是不说明它的值就是0.0,也就是很小的一些值会被println忽略掉,这也正好可以符合for(int i=0;i<10;i++){f+=0.1f;System.out.println(f);}的结果。double d=Double.MAX_VALUE;
d*=2;
System.out.println(d);
这段代码的输出是infinity,也就是说java里面的infinity不是数学含义上的无穷大,而是装不下的大。所以double x=1.0/0的结果是infinity也是可以解释的了。下面就剩下最后一个问题了,为什么float x=1/(float)(1.0/0);ok,而float x=1/(1.0/0);不ok?
1/(float)(1.0/0)是1除以一个float,1/(1.0/0)是1除以一个double。这两种情况都应该是将所有的数值转化成为double类型的,最后的结果也都是double,那么为什么一个可以赋给float,另一个却不行?
1/(float)(1.0/0)是1除以一个float,1/(1.0/0)是1除以一个double。这两种情况都应该是将所有的数值转化成为double类型的,最后的结果也都是double,那么为什么一个可以赋给float,另一个却不行?
--------------------------------------------
这里不是可不可以赋的问题,而是需要强制转型的问题。大家都知道float碰到double时会自动转成double ,但要把double赋给float的话就需要强制转型了。
{
public static void pri(float f)
{
System.out.println("It's a float!");
}
public static void pri(double d)
{
System.out.println("It's a double");
}
public static void main(String[] args)
{
pri(1/(float)(1.0/0));
}
}输出的结果是:It's a float!
可见1/(float)(1.0/0)的确是float,可能是我记错了。
(float)(1.0/0)肯定float什么好说的,
我以前是记得float,只要参与运算,就一律转化为double,看来是记错了。大家还有没有什么疑问,没有的话,结帖了。