请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,关于float和double的问题

C语言代码(编译器是MinGW):

#include <stdio.h>
int main() {
  printf("计算float类型数\n");
  float a = 0.1;
  printf("%.30f\n", a);
  float b = 0.1;
  printf("%.30f\n", b);
  float sum=a+b;
  printf("%.30f\n",sum);
  printf("计算double类型数\n");
  double numC = 0.1;
  printf("%.30f\n",numC);
  double numD = 0.1;
  printf("%.30f\n",numD);
  double sum2 = numC + numD;
  printf("%.30f\n", sum2);
}

打印结果如下:
图片描述
Java代码(编译器是JDK8)

  public static void main(String[] args) {
        System.out.println("计算float类型数据");
        float a=0.1f;
        System.out.printf("%.30f\n",a);
        float b=0.1f;
        System.out.printf("%.30f\n",b);
        float sum=a+b;
        System.out.printf("%.30f\n",sum);
        System.out.println("计算double类型数据");
        double numC=0.1;
        System.out.printf("%.30f\n",numC);
        double numD=0.1;
        System.out.printf("%.30f\n",numD);
        double sum2=numC+numD;
        System.out.printf("%.30f\n",sum2);

    }

打印结果:
图片描述
我们知道0.1无法用二进制精确表示
问题1:为什么Java语言使用double类型计算0.1+0.1时,能准确得出0.2呢???不应该呀!而使用C语言计算得出的是近似值。

问题二:不管是Java还是C语言在用float表示0.1时,近似值是0.100000001490116120000000000000
而我自己使用IEEE754标准计算0.1的近似值是(如图)
图片描述
使用这个网站计算的0.1近似值如图,和我自己计算的一样,但是和C语言,Java计算的不一样,这是为啥???按理说使用IEEE754标准,计算结果应该一样
图片描述

正在回答 回答被采纳积分+3

1回答

咚咚呛 2024-09-09 23:20:55

问题一:理论上来说,不管是C还是Java,任何double类型都不能精确表达0.1这个值,在不同平台实现的结果也会不一样,下图是老师在Mac上实现的结果,所以不管是C还是Java都是用了近似值,具体方式与平台、芯片有关。

https://img1.sycdn.imooc.com/szimg/66df12470971efd704840314.jpg

问题二:你这里计算有问题,我这里实际计算得到的结果是0.100000001490116119384765625000。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号