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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘丁 黑马帝   /  2012-2-8 20:15  /  2919 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘丁 于 2012-2-8 20:50 编辑

public class Test{     
       public static void main(String args[]){  
       System.out.println(0.05+0.01);        
       }
}
输出结果是0.060000000000000005
是何原因

评分

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

查看全部评分

6 个回复

倒序浏览
因为 小数在java中如果没有指定是单精度的,会默认为是双精度的,所以0.05+0.01  返回的结果是双精度浮点型。

评分

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

查看全部评分

回复 使用道具 举报
在程序运算中,系统会默认为double的类型。
所以会出现输出结果很长。。。
回复 使用道具 举报
你可以在前面加一个%2f,让它输出两位小数。
回复 使用道具 举报
本帖最后由 最初的理想 于 2012-2-8 20:34 编辑

java的运算符最后都是把操作数转换成二进制进行计算的。如果是浮点的话再转换成二进制并且进行运算的时候就会出现你上面这样的结果,有种说法叫做浮点截断,所以精确的浮点运算建议采用BigDecimal

public class Test{     
       public static void main(String args[]){  
               BigDecimal ab=new BigDecimal("0.05");
               BigDecimal ad=new BigDecimal("0.01");
               System.out.println(0.05+0.01);
       System.out.println(ab.add(ad).doubleValue());        
       }
}

评分

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

查看全部评分

回复 使用道具 举报
public class Test{     
        public static void main(String args[])
                {       
                        Double num = 0.05 + 0.01; //打印结果为:0.060000000000000005
                        Float nums = 0.05f + 0.01f; //打印结果为:FloatNum=0.060000002
                System.out.println(0.05+0.01 + " num=" + num + "    FloatNum=" + nums);  //所以System.out.println(0.5+0.1);默认是按double精度进行运算
        }
}

评分

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

查看全部评分

回复 使用道具 举报
我试了下 我怎么显示的是正常的 ?求解释。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马