Проблема в том, что вы используете тип данных float
, который имеет точность , не более 7,22 общих цифр , а иногда и всего 6 цифр, и вы пытаетесь отобразить 8Всего цифр (2 до десятичной и 6 после).Как отмечается в комментариях, ближайший двоичный тип с плавающей запятой к 40,432 - 40,43199920654296875, второй ближайший - 40,432003021240234375.
Вы можете получить больше цифр, преобразовав их в более крупный тип double
.Сделав это, вы можете округлить до ближайшего 6-значного числа.Обратите внимание, что если float
было сгенерировано с помощью вычисления, округление может фактически дать меньше точного результата.
Если вы всегда знаете, что ваши числа будут между 10 и 100, этот простой кодбуду работать.В противном случае вам потребуется более сложный процесс для определения подходящего количества округлений.
float f = 40.432;
double d = f;
double r = std::round(d * 10000.0) / 10000.0; // 2 digits before the decimal, 4 after
std::cout << std::fixed << std::setprecision(6) << r;
Обратите внимание, что последние 2 цифры всегда будут равны нулю из-за округления.
См. Это вдействие: http://coliru.stacked -crooked.com / a / f085e56c03ebeb73