Итак, у меня есть функция ниже, отформатированная как отображение полиморфной пустоты (string & outStr). Выходные данные этой функции в основном должны быть отформатированы в одну большую строку, которая будет сохранена в параметре outStr и возвращена вызывающей функции.
Я успешно отформатировал свою большую строку в несколько строк, но я хотел бы округлить значение с плавающей запятой до 2 знаков после запятой, но я не могу понять, как я сейчас добавляю свои строки. Я попытался использовать функции round() и ceil(), как предлагалось в некоторых сообщениях в Интернете, но 6 нулей все еще появляются после каждого десятичного знака. Я был бы признателен за помощь в этом, так как я некоторое время искал решения, но ни одно из них не сработало.
Кроме того, мне было интересно, будет ли функция to_string(), которую я использовал для преобразования моего числа с плавающей запятой в строку, правильно компилироваться и выполняться в C++98? Я использую C++11, но мой учитель использует C++98, и я очень беспокоюсь, что он не скомпилируется на ее стороне.
Если нет, может ли кто-нибудь предложить, как еще я мог бы добиться того же результата, превратив число с плавающей запятой в строку, при этом форматируя несколько строк в строковый параметр outStr и возвращая его функции? Мне не разрешено изменять параметры функции, она должна оставаться в виде display(string& outStr)
Мой вывод намного длиннее и сложнее, но я упростил пример, чтобы получить короткое и простое решение.
Опять же, буду признателен за любую помощь!
#include <iostream>
using namespace std;
#include <string>
#include <sstream>
#include <cmath>
#include "Math.h"
void Math::display(string& outStr){
float numOne = 35;
float numTwo = 33;
string hello = "Hello, your percent is: \n";
outStr.append(hello);
string percent = "Percent: \n";
outStr.append(percent);
float numPercent = ceil(((numOne / numTwo) * 100) * 100.0) / 100.0;
outStr.append(to_string(numPercent));
outStr.append("\n");
}
Вывод должен выглядеть так:
Hello, your percent is:
Number:
106.06%
Есть ли способ округлить поплавок до двух знаков после запятой в этом утверждении?
Вот что делает std::setprecision(2)
. Ты пробовал это? В чем он не соответствует вашим требованиям?
Нет необходимости делать какие-то сумасшедшие преобразования. Поскольку функция называется display, я предполагаю, что на самом деле она должна отображать значение, а не просто сохранять его в строку.
Следующий код демонстрирует, как этого можно добиться, просто отформатировав печать.
#include <cstdio>
#include <iomanip>
#include <iostream>
int main() {
double percentage = 83.1415926;
std::cout << "Raw: " << percentage << "%\n";
std::cout << "cout: " << std::fixed << std::setprecision(2) << percentage << "%\n";
printf("printf: %.2f\%%\n", percentage); // double up % to print the actual symbol
}
Выход:
Raw: 83.1416%
cout: 83.14%
printf: 83.14%
Если функция настолько обратная, как вы ее описываете, есть две возможности. Вы не понимаете, что на самом деле требуется, и даете нам плохое объяснение (мое предположение, учитывая эту сигнатуру функции), или само назначение - чистый мусор. Как бы С.О. ни любил ругать профессоров, мне трудно поверить, что то, что вы описали и написали, - это то, чего хочет профессор. Это не имеет никакого смысла.
Пара замечаний: в показанном вами коде нет ничего полиморфного. to_string()
существует с C++11, в чем легко убедиться, просмотрев функцию (Ссылка). Существует также несоответствие между тем, что ваш код пытается напечатать, и вашим выводом, и это еще до того, как мы перейдем к части форматирования чисел. "Процент" или "Число"?
Возможно, вы ищете
std::ostringstream
. Как вstd::ostringstream os; os << "Percent: " << std::fixed << std::setprecision(2) << numOne / numTwo * 100 << '%'; outStr = os.str();