我有表示数字输入数据的字符串,需要转换为整数。 数据有或没有小数点,当存储在一个长整数时需要缩放到1e-6。
实施例
input: "10.123456" to output: 10123456L
input: "1.5" to output: 1500000L
浮点运算的简单方法是
float numf;
sscanf(text,"%f",&numf);
numf *= 1E6;
result = (long)numf;
这很好,但由于四舍五入,结果不准确。它还需要我想避免的浮点数学。
准确转换此内容的好方法是什么。 我正在考虑将输入填充到所需的6位小数,然后逐位转换为long int。
答案 0 :(得分:1)
以下函数valx6e6()
通过检查第7位小数位(如果存在)来处理前导空格,负值和舍入。它不使用浮点代码。
#include <ctype.h>
#include <stdlib.h>
#define SCALE_FACTOR 1000000L
long valx6e6( const char* asc )
{
long val = 0 ;
int skip = 0 ;
while( isspace( asc[skip]) )
{
skip++ ;
}
int signum = asc[skip] == '-' ? -1 : 1 ;
// Integer part
val = atoi( &asc[skip] ) * SCALE_FACTOR ;
// Find decimal part if present
while( isdigit( asc[skip]) )
{
skip++ ;
}
// Test for decimal part
const char* decimal = &asc[skip] ;
if( *decimal == '.' )
{
decimal++ ;
long place_value = SCALE_FACTOR ;
while( place_value > 1 && isdigit( *decimal ) )
{
place_value /= 10 ;
// Add fraction
val += signum * (*decimal - '0') * place_value ;
decimal++ ;
}
}
// Round according to 7th decimal-place
if( isdigit( *decimal ) )
{
if( *decimal >= '5' )
{
val += signum ;
}
}
return val ;
}
使用以下测试用例进行测试:
val = valx6e6( "1.0" ) ;
val = valx6e6( "1.0" ) ;
val = valx6e6( "1.1" ) ;
val = valx6e6( "1.01" ) ;
val = valx6e6( "1.10" ) ;
val = valx6e6( "-1.0" ) ;
val = valx6e6( "-1.0" ) ;
val = valx6e6( "-1.1" ) ;
val = valx6e6( "-1.01" ) ;
val = valx6e6( "-1.10" ) ;
val = valx6e6( "0.4" ) ;
val = valx6e6( "0.04" ) ;
val = valx6e6( "0.004" ) ;
val = valx6e6( "0.0004" ) ;
val = valx6e6( "0.0004" ) ;
val = valx6e6( "0.5" ) ;
val = valx6e6( "0.05" ) ;
val = valx6e6( "0.005" ) ;
val = valx6e6( "0.0005" ) ;
val = valx6e6( "0.0005" ) ;
val = valx6e6( "0.0000005" ) ;
val = valx6e6( "0.0000004" ) ;
val = valx6e6( "1.2345678" ) ;
val = valx6e6( "1.2345674" ) ;
val = valx6e6( "-0.0000005" )
val = valx6e6( "-0.0000004" )
val = valx6e6( "-1.2345678" )
val = valx6e6( "-1.2345674" )
答案 1 :(得分:0)
这里我将每个数字转换为整数。如果小数部分在那里,那么我将只接下来的6位数。
让我们说string str 有输入。变量 no 将有输出。
long int no=0;
count=0;
for(i=0;str[i]!='\0';i++)
{
if(str[i]=='.')
{
i+=1;
while((count<6)&&(str[i]!='\0'))
{
no=no*10+(str[i]-48);
count+=1;
i+=1;
}
break;
}
no=no*10+(str[i]-48);
}
while(count<6)
{
no=no*10;
count+=1;
}
答案 2 :(得分:0)
您可以单独使用数字和小数部分,如下所示
int main(void)
{
int num, dec;
char f[16];
printf("enter floating point number as string\n");
scanf("%s",f);
sscanf(f,"%d.%d",&num, &dec);
printf("numeric part: %d, decimal part: %d\n", num, dec);
}
示例输出
enter floating point number as srting
10.123
numeric part: 10, decimal part: 123