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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhouchao 中级黑马   /  2013-7-6 08:50  /  979 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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型的两位小数的吗?
求解释!!

2 个回复

倒序浏览
本帖最后由 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 的浮点数只要以参与数学运算就会自动改变精度,并造成微小的误差。话说大哥我的感谢你,以前我以为希腊字母不能用来给变量命名呢,希腊字母给变量命名确实不会报错,只不过使用起来不太方便。
这是我打印的结果

回复 使用道具 举报
toShareBeauty 发表于 2013-7-6 09:39
主要原因是 java 的浮点数只要以参与数学运算就会自动改变精度,并造成微小的误差。话说大哥我的感谢你,以 ...

哦 是因为java中浮点数只要参与数学运算就会自动改变精度啊  
还有java.math.BigDecimal 这个类,BigDecimal(String val) 这个构造方法可以解决啊!
非常感谢!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马