2014-03-26 58 views
0

我有代表数字输入数据的字符串需要转换为整数。 数据带或不带小数点,需要在存储为长整数时缩放为1e-6。有理数转换为long int

input: "10.123456" to output: 1L 
input: "1.5" to output: 1500000L 

与浮点运算的简单的方法是

float numf; 
sscanf(text,"%f",&numf); 
numf *= 1E6; 
result = (long)numf; 

即精细,但结果是不准确的由于四舍五入。它还需要我想避免的浮点数学。

什么是一个很好的方法来转换这个准确。 我正在考虑将输入填充到所需的6位小数,然后将数字逐位转换为long int。

+1

听起来像是你已经理解了它。找到小数点,然后根据需要填充到六位数字或截取六位数字。然后从字符串中删除小数点并转换生成的整数。 – user3386109

+0

建议的方法本身不应对负值或舍入基于第7小数位的最低有效位数。没有填充是必要的 - 你只需要跟踪每个数字的位置值。 – Clifford

回答

1

下面的函数valx6e6()与领先的空格,负值科佩斯并且通过检查四舍五入小数点后7位(如果有的话)。它不使用浮点代码。

​​

测试了以下测试案例:

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") 
+0

我已更正此代码,以便诸如“12abc.345”之类的输入被解释为12而不是12.345。一个可能的简单改进是将比例因子作为参数而不是硬编码常数。 – Clifford

0

这里我将每个数字转换为整数。如果小数部分在那里,那么我只会选择接下来的6位数字。

让我们说字符串str有输入。变量将有输出。

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; 
} 
+0

您需要检查小数第七位以应用正确的四舍五入,并且可能也会计入负值。 – Clifford

0

可以采取单独的NUM部分和小数部分,如下

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 
+0

如果用户输入“1.1”,“1.10”和“1.01”,dec将分别包含1,10,1 - 只有第一个是正确的。 – Clifford

+0

该示例输出的拼写错误不在原始代码中。您应该使用我建议的示例值对此进行真实测试,并复制并粘贴实际输出。它仍然不起作用;你不能在一个int中存储前导零,对于小数部分,前导零很重要。 – Clifford

+0

明白了。我误解了你指出的问题。需要添加逻辑来查找小数部分中是否有前导零。 – user207064

相关问题