有理数转换为long int

时间:2014-03-26 04:05:42

标签: c embedded

我有表示数字输入数据的字符串,需要转换为整数。 数据有或没有小数点,当存储在一个长整数时需要缩放到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。

3 个答案:

答案 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