точность двойной функции на основе строки

0

Скажем, у вас есть функция:

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 как строку. Как это реализуется?

  • 0
    спринтф ?
  • 0
    Это не тот сайт, где вы говорите, какой код вы хотите написать, и ждите, пока кто-нибудь напишет его для вас. Есть так много проблем с вашим кодом, я не знаю, с чего начать. Иди получить образование.
Показать ещё 1 комментарий
Теги:

3 ответа

4
Лучший ответ

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 точно совпадает с 2.20, 2.200, 2.2000 и т.д. Если вы хотите увидеть более незначительные нули, используйте [setprecision][1]:

cout << fixed << setprecision(2);
cout << 2.2 << endl; // Prints 2.20
0

Чтобы отобразить до двух знаков после запятой, но не отображая нужных нулей, вы можете сделать что-то вроде:

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();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню