如下源代码所示,欲要c1获得字符A,c2获得字符B,a1为7.29,a2为101.29,但是我输入进去后得到的并非是我想要的结果,怎么回事?
这样写。
1.第二个输出101.290001的原因是浮点数的运算是二进制的,存在不确定尾数。
2.如果你读入的是int,double等类型的就不会出现这个问题,它会跳过换行和空格直到出现对应的数据类型,而char类型,无论是换行符还是空格都算读入一个字符。
追问还是不大明白。
①101.290001存在不确定尾数是怎么回事?
②也就是像这种不同类型的数据输入,中间需要用getchar();语句隔开?
③输入字符的那条语句中间有个空格,是为了隔开两个字符的输入吗?
比如0.1+0.2≠0.3:由于浮点数运算的时候,在计算机内部是二进制进行计算的,计算机中小数的二进制是一个无限由0和1组成的二进制,运算完后变成十进制会产生尾数,因此运算会接近0.3,在运用浮点数做运算比较的时候,就需要注意这一点。比如用户输入两个小数a,b,判断相加结果是否为0.3,那么应该用fabs(a1+a2)<=0.0000001来判断。这个学操作系统或计算机组成原理的时候都会讲。
2、3.我刚刚解释过了,如果后面输入的是char类型的,换行符和空格都会被读入,%c %c中间的空格不加那第二个c2就会读入空格,然后程序结束。如果你第二个代码读入int类型那么%d%d中间无论加不加空格效果都一样,因为它会跳过换行符和空格读入下一个数字。而%c不会,因为换行符和空行都会被%c读入。那个getchar()是读入101.29后面那个空格的,如果你输入完两个浮点数再回车换行再输入两个char字符,那么getchar()读入换行符。