2012-04-03 6 views
0

Почему atof round "14718.5084" до 14718.5? Есть ли способ предотвратить это (т. Е. Получить целое число 14718.5084)?Функция atof() округляет результат до целой части

код:

double latitude=atof("14718.5084"); 
std::cout <<"latitude test "<<latitude<< "\n"; 

и выход:

latitude test 14718.5 

благодаря

+0

Вы имеете в виду atof справа? –

+0

Я добавил код. – user1106106

ответ

2

Поскольку atof возвращает double, который вы преобразовывая в float. (Я предполагаю, что это то, что вы делаете).

Также 14718.5084 не может быть точно представлен. Например:

double f = 14718.5084; 

дает мне f == 14718.508400000001.

+0

в двоичном коде не существует никакого денатура, например 1/10 или 1/100, поэтому его округляет. –

6

Попробуйте этот код, чтобы увидеть, что делает именно то, что вы хотите:

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

int main() 
{ 
    char input [256]; 
    printf("Enter something: "); 
    gets(input); 
    printf("Result: %f\n", atof(input)); 
    return 0; 
} 

Может быть, вы потеряли цифры при печати ...

Попробуйте это:

double latitude=atof("14718.5084"); 
std::cout.precision(9); 
std::cout <<"latitude test "<< latitude << "\n"; 
+0

+1 из-за печати –

+0

Я добавил свой код сейчас. спасибо, но я не думаю, что печать - это моя проблема. – user1106106

+0

. Пожалуйста, см. дополнительный код, печатающий это было;) – HWende

1
#include <limits> 


    double latitude=atof("14718.5084"); 
    typedef std::numeric_limits<double> dbl; 
    std::cout <<"latitude test "; 
    std::cout.precision(dbl::digits10); 
    std::cout<<latitude<< "\n"; 
0

У меня была немного другая проблема, но она соответствует заголовку. atof выглядел как округление до целочисленной части, и это не проблема выходной точности. Моим решением было изменить настройки локали моей установки ubuntu. Десятичные числа были разделены запятой, а не точкой.

попробуйте этот код (запятая вместо точки):

double latitude=atof("14718,5084"); 
std::cout <<"latitude test "<<latitude<< "\n"; 

, если он выводит номер точки правильно плавающей (может быть отделена от точки), вы должны изменить свои языковые настройки на английский или работать с запятой плавающей значений в ваших данных (например, в настройках немецкого языка)

0

Настройки локалей могут добавить еще больше путаницы, поскольку, по-видимому, они не всегда действуют последовательно по всей цепочке инструментов.

E.g. Я столкнулся с проблемой, что точки разделенных значений округлялись до int на atof (например, 0,85 -> 0), потому что языковой стандарт требовал значения, разделенные запятыми. Но в то же время значения, разделенные запятыми, не были приняты средой отладчика (например, при попытке изменить значения переменных во время отладки ..).

+0

Грустно видеть этот ответ downvoted. +1, так как я думаю, это может помочь некоторым людям, которые ищут название. – Micka

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

  • Нет связанных вопросов^_^