黑马程序员技术交流社区

标题: 浮点型数据的输出结果 [打印本页]

作者: 李伟    时间: 2012-7-24 18:02
标题: 浮点型数据的输出结果
                               float f=1234567.899f;
                         System.out.println(f);//为什么输出结果是1234567.9
                System.out.println(f==1234567.899);//为什么结果是false
                                 //对于以上的两个结果有些不理解,出现这样的结果原理是什么呢?
                                

作者: 魏-玉-彪    时间: 2012-7-24 18:12
本帖最后由 魏-玉-彪 于 2012-7-24 18:16 编辑

这个  System.out.println() 语句自动调用的 tostring()方法。 发生了转型。


                float f=1234567.899f;

             String s = String.valueOf(f);                         System.out.println(s);

  这样试试
            
        
作者: 李东升    时间: 2012-7-24 19:11
对于浮点数,一个float数值占4个字节,32位,而且它并不是像表面上看的那么简单,再通,过一些运算符,精度会发生改变,我们看到的,就好像是四舍五入一样。而且,是不可能精确地定义一个浮点数的,也就是你定义了f=1234567.899f,这是一个模糊的,所以才会出现f!=1234567.899。
作者: 乐峰    时间: 2012-7-24 19:39
System.out.println(f);//这句话将浮点型的f装箱成为String类型,值会发生改变,这样才操作 System.out.println(f==1234567.899);//结果肯定是false
作者: 李菁    时间: 2012-7-24 20:41
计算机只识别二进制数据,在把源数据编译成二进制数据后,就会造成精度的丢失。
精度丢失在于浮点数由两部分组成:指数和尾数。在转换过程长,浮点数参与了计算,进行浮点数的二进制与十进制转换,转换的过程就会变的不可预知。就是在这个过程中,发生了精度的丢失。
有时浮点计算也会出现准确的结果,那是因为恰巧计算的二进制与十进制之间能够准确转换
所以System.out.println(f),结果和原值不一样,System.out.println(f==1234567.899)结果当然就是false
作者: 马振兴    时间: 2012-7-24 23:50
float 单精度浮点型占4个字节,有效数字最长7位,有效数字长度包括了整数部分和小数部分。
double 双精度浮点型数据占8个字节,有效数字最长15位。

float f=1234567.899f  1234567.899有效数字超过7位,所以会出现输出结果为1234567.9
的现象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2