本帖最后由 jackz007 于 2019-10-28 01:24 编辑
楼主的主观愿望是好的,但是,浮点数非常复杂,因为按照 IEEE32 标准,浮点数是按照特定的算法进行编码的,也就是说,浮点数只是一种近似的表达,并不能如我们所愿,像整型数那样,想写成多少就是多少。
在本例中,x = 99.778,x - (int) x = 0.778 完全没有问题,但是, 0.778 × 10 却不是我们所预期的 7.78,而是 7.779999,0.778 × 100 也不是预期的 77.8,而是 77.799988,最为关键的问题是,0.778 × 1000 也不是预期的 778,而是 777.999878,这一切都源自
浮点数只是一种近似的表达。
所以,楼主在浮点数本身下功夫提取小数部分的想法肯定是无法达成目标的。
在这里,我们采用先把浮点数转换成字符串,保留住浮点数的精度,然后,再剔除无用字符的思路来解决此问题,下面便是完整代码,楼主可以测试:
- #include <stdio.h>
- #include <string.h>
- int main(void)
- {
- char s[256] ;
- double x ;
- int a , d , k , m ;
- scanf("%lf" , & x) ;
- sprintf(s , "%lf" , x) ;
- m = strlen(s) ;
- for(d = 0 ; d < m && s[d] != '.' ; d ++) ;
- for(k = d + 1 ; k < m ; k ++) s[k - d - 1] = s[k] ;
- m = m - d - 1 ;
- s[m] = '\0' ;
- for(k = m ; k && s[k - 1] == '0' ; k --) s[k - 1] = '\0' ;
- printf("%s\n" , s) ;
- }
复制代码