您的位置:程序门 -> java -> j2se / 基础类



一个奇怪的问题:3个double类型相加出现多余小数位 


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


一个奇怪的问题:3个double类型相加出现多余小数位 [已结贴,结贴人:marf_cn]
发表于:2007-10-19 16:27:00 楼主
可能有人会说返回了double,自然会出现精度问题,用decimal转换,但我发现相加时是否出现多余小数位居然和输入的数字有关!先看代码:  


代码
public   class   test{      
        double   f1,f2,f3;      
        public   static   void   main(string[]   args)   {      
                testf   =   new   test();      
                f.setf1(12.49);      
                f.setf2(14.23);      
                f.setf3(0.95);   //注意这几个数字      
                double   all   =   f.getf1()+f.getf2()+f.getf3();      
                system.out.println(all);      
        }      
        public   double   getf1()   {      
                return   f1;      
        }      
        public   void   setf1(double   f1)   {      
                this.f1   =   f1;      
        }      
        public   double   getf2()   {      
                return   f2;      
        }      
        public   void   setf2(double   f2)   {      
                this.f2   =   f2;      
        }      
        public   double   getf3()   {      
                return   f3;      
        }      
        public   void   setf3(double   f3)   {      
                this.f3   =   f3;      
        }      
}      


上面计算3个double数相加,我在改变最后一个变量f3的值时,发现有时候会出现多余小数位,有时候又不会,例如f3=0.95的时候,结果是27.669999999999998;但f3=0.85时,结果就是27.57。  
我分别尝试了f3从0.15   ~   0.95,发现在.15/.45/.65/.95会出现多余小数位,其他情况不会。  
但却找不到什么规律,不知道是怎么回事,请各位帮忙看看。
发表于:2007-10-19 16:36:471楼 得分:5
  double   all   =   new   bigdecimal(f.getf1()).add(new   bigdecimal(f.getf2()).add(new   bigdecimal(f.getf3()));
精度问题        
发表于:2007-10-19 16:56:202楼 得分:0
精度问题
发表于:2007-10-19 17:16:493楼 得分:15
并不是所有的小数都可以用二进制浮点数来精确表示的
二进制浮点不可能将0.1——或者10的其它任何次负幂——精确表示为一个长度有限的二进制小数   (看下计算机组成原理中的浮点数的表示方法,好象有不同的标准)

解决的方法可以用bigdecimal类,该类位于java.math包中,它的用法其实挺简单的,不妨自己去查下api
发表于:2007-10-23 09:59:234楼 得分:0
多谢john了,明白。


快速检索

最新资讯
热门点击