黑马程序员技术交流社区

标题: 关于小数点后面的数字相同时的问题?? [打印本页]

作者: 荣凯旋    时间: 2012-1-20 14:25
标题: 关于小数点后面的数字相同时的问题??
本帖最后由 荣凯旋 于 2012-1-20 18:23 编辑

class Text
{
        public static void main(String[] args)
        {
               
                float f = 0.15f;
                double d = f;
                        System.out.println("d="+d);//输出结果:0.15000000596046448        同一个数弄俩不同类型!!类型提升,位数有4个字节变8个字节,有小数点后的7为升到15位
                double d1 = 0.15;
                float  f1 = (float)d1;
                        System.out.println("f1="+f1);//输出结果:0.15        同一个数弄俩不同类型!强制转换,有8个字节强制变4个字节,丢弃后4个字节~所以值是这个~有小数点后的15为变7位,后面都是0就舍弃啦
               
                double d2 = 1.15 + 1.15f;
                        System.out.println("d2="+d2);//输出结果:2.299999976158142   类型不同,小数点后面的位数相同

                double d3 = 1.15 + 1.25f;
                        System.out.println("d3="+d3);//输出结果: 类型不同,小数点的位数是不同 结果:相加2.4  
               
                float  f2 = 1.25f +1.15f;
                        System.out.println("f2="+f2);//输出结果:类型相同 小数点后数字不同 结果是2.4
               
                 
               
               
        }
}
有此结果的出了一个新问题! 为什么 也就是 d2 d3 的值得问题~~没搞清楚 为什么小数点位后面的数相同,相加就有会出现精度问题呢??
刚搞懂一个问题 新问题有出现啦~~大家想想为啥呀???是不是我咱牛角尖啦??问题出在那里呢??
作者: 房宝彬    时间: 2012-1-20 16:36
{:soso__186724445477376410_2:}个人建议啊,我觉得这种问题遇到了,去想原因很正常,但是如果想一阵还想不出原因,那你还是别想了,别把时间都仍在这上。
作者: 荣凯旋    时间: 2012-1-20 17:04
刚才去别的论坛问啦问说是,不能够用二进制精确表示所有的浮点数
作者: 荣凯旋    时间: 2012-1-20 17:05
不知道是不是这样的~~
作者: 黄秋    时间: 2012-1-20 17:58
荣凯旋 发表于 2012-1-20 17:05
不知道是不是这样的~~

确实是这样---不能够用二进制精确表示所有的浮点数,看看我刚回你--前面提问的帖子。没解决,为什么又改成"已解决"标题,不过现在我贴了长篇大论,怕是可以解惑吧。
(哪个论坛回应这么快,你一问,就说到点子上去了?你的问题,我查了资料,但未整理好,就拖了两天才贴上去)
作者: 荣凯旋    时间: 2012-1-20 18:12
谢谢啦兄弟 一起加油
作者: 孙玉伟    时间: 2012-1-20 18:52
我只是猜测,不太确定!d2的值可能是受到强制转换的影响,精度丢失。d3则是系统默认把低级别转换成高级别!

作者: 李杨    时间: 2012-1-31 01:44
如果你是科学家的话这样的数字很需要,但是科学家需要用到大型的计算机来计算高精度的数字。咱们不是科学家咱们的电脑计算数字是有限的。你这个精度问题让电脑都头疼了。这个精度问题足够应用就行了。毕竟咱们不是研究天体行星或者太阳系的科学家。呵呵!!!!别介意我这说啊。。




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