У меня есть строка
strValue = "11.900000"
Я хочу разобрать его в значение с плавающей точкой. Итак, я попробовал:
float fValue = -1;
sscanf_s(strValue.c_str(), "%f", &fValue);
try
{
double test = std::stod(strValue, &sz);
fValue = (float) std::stod(strValue, &sz);
}
catch (...)
{
fValue = -1;
}
За double
это точно:
тест = 11,900000000000000
За float
неточно
fValue = 11.8999996
Есть ли возможность сделать это точно?
(Я знаю, что при работе с поплавками есть неточность, но есть ли лучший способ сделать это?)
Значение 11.8999996
является наиболее точным приближением 11.9
что может быть представлено float
тип.
Единственный способ для вас — использовать десятичный тип с плавающей точкой. Если ваша платформа имеет FLT_RADIX == 10
тогда вы можете напрямую использовать float
, но, очевидно, это не ваш случай, и я не знаю ни одной текущей системы, которая использует десятичное число с плавающей точкой кроме IBM z-серии.
Таким образом, вам нужен собственный тип для этого. Вы можете использовать некоторые библиотеки IEEE-754 decimal32, такие как Десятичная математическая библиотека Intel® с плавающей запятой или если вы используете GCC, он уже имеет поддержку десятичное число с помощью _Decimal32
тип
Вы можете найти больше информации в этом вопросе Как использовать десятичную (с плавающей точкой) в C ++?