Конвертировать float в string с точностью и без допусков - PullRequest
0 голосов
/ 31 мая 2018

Как вы можете конвертировать число с плавающей точкой с заданной точностью без допуска?Например, с точностью 6 получим следующий результат.

40.432 -> 40.432000.

В строке единственное значение, которое я могу получить, это 40.431999.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Проблема в том, что вы используете тип данных 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

0 голосов
/ 31 мая 2018

Как преобразовать число с плавающей точкой в ​​указанную точность

Вы можете использовать поток строки:

std::ostringstream strs;
strs << std::fixed << std::setprecision(6)  << the_value;
std::string str = strs.str();

В строке единственное значениея могу получить 40.431999.

Ваша проблема может заключаться в том, что не существует точного представления для 40.432 в формате с плавающей запятой, который использует ваша система.Поскольку у вас никогда не может быть значения с плавающей точкой 40.432, вы никогда не сможете преобразовать такое значение в строку.

Просто так получается, что ближайшее представимое значение для 40,432 ближе к 40,431999, чем к 40,432.

Вам необходимо:

  1. Либо принять это 40,432~~ 40.431999
  2. Или используйте формат с плавающей запятой, который является достаточно точным, чтобы иметь представление для 40.432, которое ближе к 40.432, чем к 40.431999, и также достаточно точное для всех других чисел, для которых у вас естьконкретное ожидаемое значение.IEEE 754 с плавающей запятой двойной точности имеет представимое значение ближе к 40,432, чем 40,431999.
  3. Или прекратите использование плавающей запятой.У вас не возникнет подобных проблем, если вы используете типы данных с фиксированной или произвольной точностью.
...