黑马程序员技术交流社区

标题: double运算结果肿么会这样子? [打印本页]

作者: 黄奕豪    时间: 2012-5-16 21:35
标题: double运算结果肿么会这样子?
本帖最后由 黄奕豪 于 2012-5-16 21:50 编辑

今天忽然写一个关于double数据问题运算的小程序,忽然发现了一个奇怪的问题,于是做了下面一个求圆面积的小程序来测试,很是疑惑,
传入24的结果是:1808.6399999999999
传入18的结果是:1017.36
传入12的结果是:452.15999999999997
传入9的结果是:254.34
传入6的结果是:113.03999999999999
传入5的结果是:78.5
传入4的结果是:50.24
传入3的结果是:28.259999999999998
传入2的结果是:12.56
传入1的结果是:3.14
为什么传入3、6、12、24 ...这个3加倍的数列的时候结果的小数位数那么多,而传入其他数字的小数位数可以理解。
  1. class Circle//定义圆类
  2. {
  3.         private static double PI=3.14;//圆周率
  4.         private double radius;
  5.         Circle(double radius)
  6.         {
  7.                 this.radius=radius;
  8.         }
  9.         public double getArea()//求圆的面积
  10.         {
  11.                 return PI*radius*radius;
  12.         }
  13.         public static void main(String[] a)
  14.         {
  15.                 Circle cl=new Circle(2);//在这里传入数据
  16.                 System.out.println(cl.getArea());
  17.         }
  18. }
复制代码

作者: 黄燕京    时间: 2012-5-16 21:52
Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出错误,
比如System.out.println(0.05+0.01);

System.out.println(1.0-0.42);

System.out.println(4.015*100);

System.out.println(123.3/100);
结果是这个样子的
0.060000000000000005

0.5800000000000001

401.49999999999994

1.2329999999999999
作者: 黄奕豪    时间: 2012-5-16 22:05
黄燕京 发表于 2012-5-16 21:52
Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。 ...

:L看来我OUT了,那浮点数只能用来存数据不能用来运算么?如果真要运算要怎么样?
作者: 梁小波    时间: 2012-5-16 22:52
的确不能简单的计算,如果想计算用import  java.math.BigDecimal;
可以构造一个BigDecimal对象来实现!
如BigDecimal  myradius=new BigDecimal(Double.ToString(radius));
这样myradius.multiply(myradius).doubleValue(); 就可以了计算出radius的平方了!
一定注意Double.ToString(radius)!虽然有double类型的构造函数,但一定要用tostring方法转化为String类型。那个double的貌似不能直接用!
你可以详细的看一下 java.math.BigDecimal。




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