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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余银桂 中级黑马   /  2012-6-21 02:36  /  2415 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余银桂 于 2012-6-21 17:59 编辑
  1. public class Test {
  2.          
  3.     public static void main(String[] args) {

  4.             double a=2.0,b=1.1,c=0.9;
  5.             System.out.println( a-b );  //测试 a-b 的结果
  6.       if(a-b==c){
  7.              System.out.println("OK");
  8.              }else{
  9.              System.out.println("不OK");
  10.              }

  11.     }

  12. }
复制代码
鄙人愚见,一眼过去,这答案应该是 OK ,可是悲剧的错了,我就纳闷了,为什么?
我就打印试试  a-b 的答案是什么,结果输出 0.8999999999999999   这是为什么?
double的精度问题很受伤啊!

6 个回复

倒序浏览
浮点数采用的是二进制系统表示,而在二进制系统中无法精确表示分数 1/10,
就好比十进制无法精确表示1/3一样,如果需要在计算中不含有任何舍入误差,就应该使用 BigDecimal类!

回复 使用道具 举报
浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是因为数的大小,而是因为数的精度。在使用 float 和 double 作精确运算的时候要特别小心。
回复 使用道具 举报
用 DecimalFormat 格式化数字
  1.    public static void main(String[] args) {
  2.                    
  3.                   DecimalFormat format = new DecimalFormat("0.0");//这样就好了

  4.                     double a=2.0,b=1.1,c=0.9;
  5.                     double d = Double.valueOf(format.format(a-b));
  6.                     System.out.println( d );  //测试 a-b 的结果
  7.               if(d==c){
  8.                      System.out.println("OK");
  9.                      }else{
  10.                      System.out.println("不OK");
  11.                      }
  12.           
  13.             }
复制代码
回复 使用道具 举报

      如果你对在Double.toString 文档中所设定的将double 类型的值转换为字符串
的规则有所了解,你就会知道该程序打印出来的小数,是足以将double 类型的
值与最靠近它的临近值区分出来的最短的小数,它在小数点之前和之后都至少有
一位。因此,看起来,该程序应该打印0.9 是合理的。

     这么分析可能显得很合理,但是并不正确。如果你运行该程序,你就会发现它打
印的是0.8999999999999999

      问题在于1.1 这个数字不能被精确表示成为一个double,因此它被表示成为最
接近它的double 值。该程序从2 中减去的就是这个值。遗憾的是,这个计算的
结果并不是最接近0.9 的double 值。表示结果的double 值的最短表示就是你所
看到的打印出来的那个可恶的数字。

更一般地说,问题在于并不是所有的小数都可以用二进制浮点数来精确表示的
回复 使用道具 举报
float和double都无法进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾。再给楼主提供一种方法:
  1. public static void main(String[] args) {
  2.           /*         
  3.                   DecimalFormat format = new DecimalFormat("0.0");//这样就好了

  4.                     double a=2.0,b=1.1,c=0.9;
  5.                     double d = Double.valueOf(format.format(a-b));
  6.                     System.out.println( d );  //测试 a-b 的结果
  7.               if(d==c){
  8.                      System.out.println("OK");
  9.                      }else{
  10.                      System.out.println("不OK");
  11.                      }*/
  12.                    
  13.                      double a=2.0,b=1.1,c=0.9;
  14.                     BigDecimal bd1 = new BigDecimal(Double.toString(a));
  15.                     BigDecimal bd2 = new BigDecimal(Double.toString(b));
  16.                     double d = bd1.subtract(bd2).doubleValue();
  17.                     System.out.println(d);
  18.                    
  19.                      if(d==c){
  20.                      System.out.println("OK");
  21.                      }else{
  22.                      System.out.println("不OK");
  23.                      }
  24.                    

  25.             }
复制代码
回复 使用道具 举报
看看...........................
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马