В результате вы получаете округление десятичных разрядов. Это связано с тем, что как только вы вводите число с плавающей запятой, каким бы ни было число десятичных разрядов, оно сохраняется с таким количеством десятичных разрядов, как и точность типа данных. Так что для float (который может хранить 8 десятичных знаков), если вы введете
1.1234 ---- Stored as ---> 1.12339997
1.123 ---- Stored as ---> 1.12300003
5.7741589 ---- Stored as ---> 5.77415895
Таким образом, вы храните входные данные в этих числах (8) десятичных знаков. Что можно сделать, это то, что вы можете использовать приведенный ниже фрагмент, чтобы принудительно использовать желаемое количество цифр после десятичных разрядов и преобразовать его в строку.
float num;
cin >> num;
char buf[20];
// 8 is as per the (precision required + 1). So in this case,
// we have 7 digits after decimal, so 8 is used.
sprintf(buf, "%.8f", num);
// Truncating the rounding off
buf[strlen(buf) - 1] = '\0';
string s(buf);
s = s.substr(s.find('.') + 1, s.length());
cout << s << endl;
Хотя при таком подходе необходимо, чтобы все ваши входные данные имели одинаковое количество десятичных знаков.
Это своего рода обходной путь, потому что введенное вами значение 5.7741589 не сохраняется как есть. Итак, если сам источник не тот, который вы ввели, как вы можете получить желаемый результат, если предположить, что источник - это то, что вы предоставили.