Скажем, у вас есть функция:
string function(){
double f = 2.48452
double g = 2
double h = 5482.48552
double i = -78.00
double j = 2.10
return x; // ***
}
* для x вставляем:
if we will insert f, function returns: 2.48
if we will insert g, function returns: 2
if we will insert h, function returns: 5482.49
if we will insert i, function returns:-78
if we will insert j, function returns: 2.1
Они всего лишь пример, который показывает, как работает funcion(). Точно: функция для двойного возврата k округлила ее до: k.XX, но для: k = 2.20 она возвращает 2.2 как строку. Как это реализуется?
1) Только потому, что вы видите две цифры, это не означает, что базовое значение обязательно округляется до двух цифр.
Точность значения VALUE и количества цифр, отображаемых в FORMATTED OUTPUT, - это две совершенно разные вещи.
2) Если вы используете cout, вы можете управлять форматированием с помощью "setprecision()":
http://www.cplusplus.com/reference/iomanip/setprecision/
ПРИМЕР (из приведенной выше ссылки):
// setprecision example
#include <iostream> // std::cout, std::fixed
#include <iomanip> // std::setprecision
int main () {
double f =3.14159;
std::cout << std::setprecision(5) << f << '\n';
std::cout << std::setprecision(9) << f << '\n';
std::cout << std::fixed;
std::cout << std::setprecision(5) << f << '\n';
std::cout << std::setprecision(9) << f << '\n';
return 0;
}
выход образца:
3.1416
3.14159
3.14159
3.141590000
Математически 2.2
точно совпадает с 2.20
, 2.200
, 2.2000
и т.д. Если вы хотите увидеть более незначительные нули, используйте [setprecision][1]
:
cout << fixed << setprecision(2);
cout << 2.2 << endl; // Prints 2.20
Чтобы отобразить до двух знаков после запятой, но не отображая нужных нулей, вы можете сделать что-то вроде:
std::string function(double value)
{
// get fractional part
double fracpart = value - static_cast<long>(value);
// compute fractional part rounded to 2 decimal places as an int
int decimal = static_cast<int>(100*fabs(fracpart) + 0.5);
if (decimal >= 100) decimal -= 100;
// adjust precision based on the number of trailing zeros
int precision = 2; // default 2 digits precision
if (0 == decimal) precision = 0; // 2 trailing zeros, don't show decimals
else if (0 == (decimal % 10)) precision = 1; // 1 trailing zero, keep 1 decimal place
// convert value to string
std::stringstream str;
str << std::fixed << std::setprecision(precision) << value;
return str.str();
}