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标准,计算结果应该一样