2015-10-19 3 views
0

Я пытаюсь преобразовать переменную из строки в float. Но я ошибаюсь. Ниже мой код.Преобразование из строки в float

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 
#include <string.h> 

main(int argc,char *argv[]) 
{ 
    char endTime[4][26]; 
    time_t timere; 
    struct tm *tm_infoe; 
    float dlay[4][3]; 
    time(&timere); 
    tm_infoe = localtime(&timere); 
    strftime(endTime[1], 26, "%Y%m%d%H%M%S", tm_infoe); 
    printf("Endtime %s\n", endTime[1]); 
    dlay[1][1]=atol(endTime[1]); 
    printf("Value from atol:%ld\n", atol(endTime[1])); 
    dlay[1][1]=atof(endTime[1]); 
    printf("Float value from atof:%f\n", dlay[1][1]); 
    sscanf(endTime[1], "%f", &dlay[1][1]); 
    printf("Float value from sscanf:%f\n", dlay[1][1]); 
} 

Обе функции atof и sscanf дают неправильные значения. Ниже приведен вывод. Не могли бы вы рассказать мне, где ошибка?

Endtime 20151018221710 
Value from atol:20151018221710 
Float value from atof:20151017668608.000000 
Float value from sscanf:20151017668608.000000 

atol дает правильное значение, но оно мне нужно в поплавком формате.

+0

Как это так? Это не улучшится. – deviantfan

+1

'float' с точностью до 7-8 десятичных цифр. Похоже, вы наблюдаете результаты в этом допуске. Что снова кажется проблемой? –

ответ

1

Здесь вы должны использовать double вместо float. В то время как вы используете float, многие цифры могут незначительно меняться. Поэтому вы получаете такую ​​ценность, но не ошибаетесь.

Вот простой пример с использованием double -

#include <stdio.h> 
int main(void){ 
    char s[]="20151018221710";  // your string 
    double a;      // declare a as double 
    sscanf(s,"%lf",&a);    // use %lf specifier for double 
    printf("%f",a);     //print value of a 
    return 0; 
} 

выход -

20151018221710.000000

Demo here

+0

Благодарим вас, изменив тип данных с плавающей точкой на двойной тип данных. Спасибо за быстрый ответ. –

+0

@SriHarshaChennavajjala Добро пожаловать :) – ameyCU

Смежные вопросы