atof случайно не работает исправление

Кажется, у меня какая-то странная проблема с atof () функция не преобразует некоторые значения правильно. Для тех же значений atoi () работает отлично.
Вот небольшой фрагмент того, что я делаю:

...
// frequencies is a std::string in format a10d50f20 etc. i.e. letter|frequency in %
// 6 - 48 characters, always correctly formatted
for (size_t i = 0; i < frequencies.size(); i+=3)
{
// #1
double percentage = atof(frequencies.substr(i+1, i+2).c_str()) / 100;
// #2
double percentage = static_cast<double>(atoi(frequencies.substr(i+1, i+2).c_str())) / 100;

cout << frequencies[i] << " - " << percentage << endl;
}
...

По какой-то странной причине только метод № 2, кажется, всегда работает правильно.

Примеры выходов

ЗА: частоты = «a30b30c40»

И то и другое методы работают правильно, давая мне:
а — 0,30
б — 0,30
с — 0,40

ЗА: частоты = «a10b10c10d10e10f50»

с atof () Я получил:
а — 0,10
б — 0,10
с — 1000000000,00 !?
д — 1000000000,00 !?
е — 0,10
f — 0,50
в то время как правильно () правильно дает мне это:
а — 0,10
б — 0,10
с — 0,10
д — 0,10
е — 0,10
f — 0,50

постскриптум Я не могу использовать std :: stod, потому что …

0

Решение

Второй аргумент substr это длина, а не смещение.

Когда вы звоните substr(i+1, i+2) за d вы получаете весь остаток строки, который затем анализируется как экспоненциальная запись 10e10 то есть 10 * 1010.

4

Другие решения

За d atof функция взяла 10e10 как 10 x (10 ^ 10) = 1000000000.0 (в инженерной нотации / стандартной форме).

Вы действительно получили 1000000000.0 за c? Я не знаю, произошло ли то же самое.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector