黑马程序员技术交流社区

标题: 精度问题 [打印本页]

作者: 刘丁    时间: 2012-2-8 20:15
标题: 精度问题
本帖最后由 刘丁 于 2012-2-8 20:50 编辑

public class Test{     
       public static void main(String args[]){  
       System.out.println(0.05+0.01);        
       }
}
输出结果是0.060000000000000005
是何原因
作者: 余海龙    时间: 2012-2-8 20:19
因为 小数在java中如果没有指定是单精度的,会默认为是双精度的,所以0.05+0.01  返回的结果是双精度浮点型。
作者: 杜明辉    时间: 2012-2-8 20:23
在程序运算中,系统会默认为double的类型。
所以会出现输出结果很长。。。
作者: 马欢    时间: 2012-2-8 20:24
你可以在前面加一个%2f,让它输出两位小数。
作者: 最初的理想    时间: 2012-2-8 20:31
本帖最后由 最初的理想 于 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());        
       }
}

作者: 彭沛东    时间: 2012-2-8 21:28
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精度进行运算
        }
}


作者: 冯心程    时间: 2012-2-8 21:42
我试了下 我怎么显示的是正常的 ?求解释。。。。




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