Я пытаюсь получить текущую версию opengl.
glGetString(GL_VERSION) возвращается
"4.6.0 NVIDIA 391.01"
std::string strVersion = (const char*)glGetString(GL_VERSION);
strVersion = strVersion.substr(0, strVersion.find(" "));
float number = std::atof(strVersion.c_str());
число с плавающей запятой = 4.59999990
почему float не 4.6.0?
С каких это пор у реальных чисел есть две десятичные точки?
если я перейду на strVersion.substr(0, 3), чтобы строка была «4.6», число с плавающей запятой по-прежнему будет 4.59999990
Возможный дубликат Математика с плавающей запятой не работает?





Почему ты не получаешь третий номер
std::atof примет столько символов, сколько может, что представляет десятичное число. Это 4.6. Следующая точка не может быть частью числа, потому что не существует такого понятия, как десятичное число с двумя точками. В десятичных числах есть только одна точка, разделяющая целое число и дробные части.
Почему вы получаете 4.59999990 вместо 4.6
Поскольку числа с плавающей запятой не может хранить любую возможную комбинацию целое число и дробная часть. У них ограниченное пространство для хранения информации, поэтому они всегда являются приблизительными. См. математика с плавающей запятой не работает?.
Как получить версию
Версия - это не число. Эта версия состоит из трех чисел, а не из одного: 4, 6 и 0. Это целые числа, а не десятичные числа. Поэтому вам нужно либо просто обработать версию как строку:
if (strVersion == "4.6.0")
или вам нужно разделить его на три части и получить эти целочисленные значения отдельно. См. Разделение C++ std :: string с помощью токенов, чтобы узнать, как это сделать.
Во-первых, «4.6.0» не является допустимым числом. В числах не может быть двух десятичных знаков. Во-вторых, значения с плавающей запятой неточны.