Теперь я понимаю, что float
менее точны, чем double
, но объясняет это, когда у меня есть std::string
:
"7.6317"
и я делаю:
float x = atof(myString.c_str());
ожидается получение 7.63170004? Есть ли способ, которым я могу указать назначение x только для чтения первых четырех знаков после запятой? Или это из-за того, как в поплавочном представлении хранится номер 7.6317?
Да. Это ожидаемо. Это так называемая ошибка с плавающей запятой.
Некоторые литералы с плавающей запятой не имеют точного представления на компьютере, даже если - в десятичной системе обозначений - число кажется безобидным. Это связано с тем, что компьютер использует 2 в качестве базы. Таким образом, даже если число может иметь конечное представление в базе 10, оно может отсутствовать в базе 2.
вы можете сделать это так:
float x = floorf(val * 10000) / 10000;
Я думаю, он должен работать! см. См.
float
не может хранить X десятичных знаков. Вы можете сказать это печатать с определенной точностью. Иdouble
имеет такое же поведение. И используйтеstd::stof
.