A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 荣凯旋 黑马帝   /  2012-1-20 14:25  /  2181 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 荣凯旋 于 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 的值得问题~~没搞清楚 为什么小数点位后面的数相同,相加就有会出现精度问题呢??
刚搞懂一个问题 新问题有出现啦~~大家想想为啥呀???是不是我咱牛角尖啦??问题出在那里呢??

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

7 个回复

倒序浏览
{:soso__186724445477376410_2:}个人建议啊,我觉得这种问题遇到了,去想原因很正常,但是如果想一阵还想不出原因,那你还是别想了,别把时间都仍在这上。
回复 使用道具 举报
刚才去别的论坛问啦问说是,不能够用二进制精确表示所有的浮点数
回复 使用道具 举报
不知道是不是这样的~~
回复 使用道具 举报
荣凯旋 发表于 2012-1-20 17:05
不知道是不是这样的~~

确实是这样---不能够用二进制精确表示所有的浮点数,看看我刚回你--前面提问的帖子。没解决,为什么又改成"已解决"标题,不过现在我贴了长篇大论,怕是可以解惑吧。
(哪个论坛回应这么快,你一问,就说到点子上去了?你的问题,我查了资料,但未整理好,就拖了两天才贴上去)

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
谢谢啦兄弟 一起加油
回复 使用道具 举报
孙玉伟 黑马帝 2012-1-20 18:52:46
7#
我只是猜测,不太确定!d2的值可能是受到强制转换的影响,精度丢失。d3则是系统默认把低级别转换成高级别!
回复 使用道具 举报
李杨 黑马帝 2012-1-31 01:44:57
8#
如果你是科学家的话这样的数字很需要,但是科学家需要用到大型的计算机来计算高精度的数字。咱们不是科学家咱们的电脑计算数字是有限的。你这个精度问题让电脑都头疼了。这个精度问题足够应用就行了。毕竟咱们不是研究天体行星或者太阳系的科学家。呵呵!!!!别介意我这说啊。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马