刚才有个人问了个问题
把我的欲望勾起来了,但是问题还没解决呢,就结了
我开个帖继续问。
主  题:  菜鸟基础问题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也不会得到无穷大,挺多是溢出。我也不太明白,关注中

解决方案 »

  1.   

    float x=1/(1.0/0);这个为什么会错,因为小数默认的是double型,一般float赋初值,例如:
    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的。
      

  2.   

    我认为double型的都是不精确的数,
    0不是真正的0,存在微小的误差的
      

  3.   

    回复lcwlyl(网络幽灵) 
    我知道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值不可能得到无穷大呀?
      

  4.   

    回复jdbc(.Config)你说0不是精确的0,存在微小的误差
    我们就当它是0.0000000000000000000000000000000000000000000000000000001吧
    那么为什么
    float x=0;
    System.out.println(x);
    输出的结果是0.0,而不是0.0000000000000000000000000000000000000000000000000000001呢?而且1.0/0.0000000000000000000000000000000000000000000000000000001即使这个数非常小,但是也是一个确定的数呀,结果也不应该是无穷大吧。
      

  5.   

    float x=0;
    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。
      

  6.   

    我记得看过一本书是这样写的,在java中,如果你的程序用到浮点数运算时,务必要控制好误差的大小,特别是那些不允许有误差存在的程序,像是财务,科学计算等。
      

  7.   

    回复lcwlyl(网络幽灵)float x=0;
    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,另一个却不行?
      

  8.   

    下面就剩下最后一个问题了,为什么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,另一个却不行?
    --------------------------------------------
    这里不是可不可以赋的问题,而是需要强制转型的问题。大家都知道float碰到double时会自动转成double ,但要把double赋给float的话就需要强制转型了。
      

  9.   

    我有点不明白了,楼主是怎么知道1/(float)(1.0/0)结果是double型的?
      

  10.   

    1/(float)(1.0/0)这句应该是float型的,楼主可以看一下自动类型转换,但它可以赋给double型的变量,正如naruto_zy(努力追求。) 所说的。
      

  11.   

    class Test
    {
    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,看来是记错了。大家还有没有什么疑问,没有的话,结帖了。