Функция atof () округляет свой результат до целочисленной части - PullRequest
0 голосов
/ 03 апреля 2012

Почему от раунда "14718.5084" до 14718,5? Есть ли способ предотвратить это (то есть получить целое число 14718.5084)?

код:

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

и вывод:

latitude test 14718.5

спасибо

Ответы [ 5 ]

6 голосов
/ 03 апреля 2012

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

#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";
2 голосов
/ 03 апреля 2012

Потому что atof возвращает double, который вы конвертируете в float.(Полагаю, это то, что вы делаете).

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

double f = 14718.5084;

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

1 голос
/ 03 апреля 2012
#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 голосов
/ 24 января 2014

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

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

0 голосов
/ 17 мая 2013

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

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

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

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

...