C语言 如何确定输入的float型的小数点位数

RT#include<stdio.h>void main(){float i;scanf("%f",&i);}---------------------------------------我的输入是 2.22 用什么办法确定我输入的float型的小数点位数??

输入后,十进制数变2进制。十进制小数 化 2进制小数 常常 化不尽,所以用 大于小于来判断float型是否正好大于小于某数值是困难的。
简单办法是用字符串方法读入,直接判断字符串。
float i;
char str[32];
int j,L;
scanf("%s",str);
sscanf(str,"%f",&i);
L = strlen(str);
然后查找小数点,for (j=0;j<L;j++) if (str[j]=='.') { 有小数点,记录下j的位置
。。。 };
然后从最小的一位 str[L-1] 起循环,找到第一个不是 0 的位置。 if (str[k] !='0'){....}
算出位数。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-24
楼上说的很对,要是你明白小数的二进制存储方式,你就知道了,只是近似存储,除非是0.5,0.25,0.75等这些2的n次方分之几的数是精确存储为,其他的都是近似存储的
要想精确存储,只能用字符串
第2个回答  推荐于2017-09-12
确定输入的float型的小数点位数,可以通过sprintf函数实现数字转字符串,处理字符串,判断小数点“.”后的位数实现,但由于系统中float存在7位有效数字(含小数点,即小数点后有6位小数),使得系统或者补0,或者截断,导致统计与实际输入数字的位数不符。
//主要代码
char buffer[40];
float fnum=12.38;
sprintf(buffer,"%f",fnum);//获得字符串
int i=0,num=0;
for(;*(buffer+i)!='\0';i++)
{
if(*(buffer+i)=='.')
num=0;//小数点后开始计数
else
num++;//统计小数点后数字位数
}

float 为单精度浮点型数据,在Turbo
C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。建议输入采用字符串形式,这样统计不会出偏差,使用数字时,使用double atof( const char *str )函数转换。