黑马程序员技术交流社区

标题: double的运算 [打印本页]

作者: zhouchao    时间: 2013-7-6 08:50
标题: double的运算
本帖最后由 zhouchao 于 2013-7-6 10:04 编辑
  1. class Circle
  2. {
  3.         int r;
  4.         private final double π = 3.14;
  5.         String form = "圆形";
  6.         double area;
  7.         Circle(int r)
  8.         {
  9.                 this.r = r;
  10.         }
  11.         public double calcalation()
  12.         {
  13.                
  14.                 area = π*r*r;
  15.                 return area;
  16.         }
  17. }
复制代码
为何打印结果是28.259999999999998
不是应该返回double型的两位小数的吗?
求解释!!
作者: toShareBeauty    时间: 2013-7-6 09:39
本帖最后由 toShareBeauty 于 2013-7-6 10:06 编辑
  1. import java.math.BigDecimal;

  2. class Circle
  3. {
  4.         int r;
  5.         // 这里编译器把 3.14 就转换为 double 类型的 3.14,但是精度不变仍然是 3.14,不是3.140000什么的
  6.         private final double π = 3.14;
  7.         String form = "圆形";
  8.         double area;
  9.         Circle(int r)
  10.         {
  11.                         this.r = r;
  12.         }
  13.         public double calcalation()
  14.         {
  15.                         // 这里 double 类型参与数学运算,就会导致 double 类型的精度改变,这也是为什么java中的
  16.                         // float double 不能参与商业的数学运算, 解决这个问题可以使用  java.math.BigDecimal 这
  17.                         // 个类。并且要使用 BigDecimal(String val) 这个构造方法。跟详细的你可以参考一下,
  18.                         // http://blog.csdn.net/zhaoyw2008/article/details/9256777 这篇博文,或者查看 JDK api manual
  19.                         area = π*r*r;
  20.                         
  21.                         //*这是我的用 BigDecimal 解决的方法
  22.                         BigDecimal b1 = new BigDecimal(Double.toString(r));
  23.                         BigDecimal b2 = new BigDecimal(Double.toString(π));
  24.                         b1 = b1.multiply(b1);
  25.                         return b1.multiply(b2).doubleValue();
  26.                         //*/

  27.                         // return area;
  28.         }
  29. }
复制代码
主要原因是 java 的浮点数只要以参与数学运算就会自动改变精度,并造成微小的误差。话说大哥我的感谢你,以前我以为希腊字母不能用来给变量命名呢,希腊字母给变量命名确实不会报错,只不过使用起来不太方便。
这是我打印的结果


作者: zhouchao    时间: 2013-7-6 10:03
toShareBeauty 发表于 2013-7-6 09:39
主要原因是 java 的浮点数只要以参与数学运算就会自动改变精度,并造成微小的误差。话说大哥我的感谢你,以 ...

哦 是因为java中浮点数只要参与数学运算就会自动改变精度啊  
还有java.math.BigDecimal 这个类,BigDecimal(String val) 这个构造方法可以解决啊!
非常感谢!!




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