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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM张博文 高级黑马   /  2013-5-29 13:49  /  1591 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM张博文 于 2013-5-29 16:43 编辑

Analyze the following fragment:
double sum = 0;
double d = 0;
while (d != 10.0) {
  d += 0.1;
  sum += sum + d;
}

A. The program does not compile because sum and d are declared double, but assigned with integer value 0.
B. The program never stops because d is always 0.1 inside the loop.
C. The program may not stop because of the phenomenon referred to as numerical inaccuracy for operating with floating-point numbers.
D. After the loop, sum is 0 + 0.1 + 0.2 + 0.3 + ... + 1.9

The correct answer is C。
Can you tell me why?

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

4 个回复

倒序浏览
      选项c的意思大概是说:该程序不会停止因为涉及到浮点数操作,会出现数值不准确现象。我在本机上验证了一下,果然不会停下来。
     因为double是双精度型的小数,精确度达到16位的,所以它不会和10.0相同。如果要计算0.1+0.2+……+9.9的话下列这段代码可完成。
  1.                 class Demo{
  2.             public static void main(String[] args){
  3.                     double sum = 0;
  4.                     double d = 0;
  5.                     while (d<10.0) {
  6.                       d += 0.1;
  7.                       sum += sum + d;
  8.                     }
  9.                     System.out.println(sum);
  10.            }
  11.                 }
复制代码

点评

谢谢了  发表于 2013-5-29 14:36

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
    这应该涉及到浮点数在计算机中的存储问题吧,浮点数是以符号位+指数位+尾数部分组成,也就是在进行+0.1的操作的时候,由于0.1转换成二进制时不错的话应该是0.000110011……一个十分近似的值,所以在以这个近似值进行运算,会出现一定的误差也就是在计算时d的值不会是0.1  0.2 0.3 ……这样的值,而是在某一部分误差变大使得d不会再是小数点后只有一位,而是存在许多小数,这样d就不会再能够得到10.0的值而是9.99999……98和10.099999……98这两个10.0附近的值,从计算结果中我们可以看到在第三次运算时已经出现误差得到0.30000……004
    如果将d != 10.0,改成d!=0.2(或者0.4,0.5等几个值)程序是可以停止的

点评

谢谢了  发表于 2013-5-29 16:45

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
给个可以运行的代码,有点麻烦
import java.text.*;
class Demo
{
        private static final double a = 4.0;
        public static void main(String[] args)
        {
               
                double d=0.0;
                double sum=0.0;
                while (Double.parseDouble(new java.text.DecimalFormat("0.0").format(d)) != a)
                        {
                        d += 0.1;
                        System.out.println(new java.text.DecimalFormat("0.0").format(d));
                        sum +=d;
                }
        }
}

点评

谢谢了  发表于 2013-5-29 16:46

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马