Как отформатировать числа в значащие цифры с помощью STL - PullRequest
4 голосов
/ 24 сентября 2011

Я пытаюсь отформатировать числа к определенному числу значащих цифр, используя C / C ++ и предпочтительно STL.Я видел примеры этого в Javascript (toPrecision ()) и .Net, но я не могу найти ничего подобного в C / C ++.Я хочу создать функцию примерно так:

std::string toPrecision(double value, int significantDigits) {
    std::string formattedString;
    // magic happens here
    return formattedString;
}

, чтобы она давала такие результаты:

toPrecision(123.4567, 2) --> "120"
toPrecision(123.4567, 4) --> "123.4"
toPrecision(123.4567, 5) --> "123.45"

Кто-нибудь знает хороший способ сделать это?Я рассматриваю возможность выбросить целое число в строку, а затем просто просканировать его, чтобы найти ненулевые цифры и подсчитать их каким-то разумным способом, но это кажется громоздким.код в один из браузеров и просто посмотреть, как выглядит их функция toPrecision, но я думаю, что мне понадобится целый день, чтобы разобраться с незнакомым кодом.Надеюсь, что кто-то может помочь!

Ответы [ 3 ]

4 голосов
/ 24 сентября 2011

украдено у другой вопрос :

#include <string>
#include <sstream>
#include <cmath>
#include <iostream>

std::string toPrecision(double num, int n) {
    /168407/okruglenie-do-proizvolnogo-chisla-znachaschih-tsifr

    if(num == 0) {
      return "0";
    }

    double d = std::ceil(std::log10(num < 0 ? -num : num));
    int power = n - (int)d;
    double magnitude = std::pow(10., power);
    long shifted = ::round(num*magnitude);

    std::ostringstream oss;
    oss << shifted/magnitude;
    return oss.str();
}

int main() {
  std::cout << toPrecision(123.4567, 2) << "\n";
  std::cout << toPrecision(123.4567, 4) << "\n";
  std::cout << toPrecision(123.4567, 5) << "\n";
}
1 голос
/ 24 сентября 2011

Проверьте setprecision () в iomanip. Это должно сделать то, что вы ищете на двойной, а затем просто конвертировать в строку

0 голосов
/ 24 сентября 2011

Распечатайте его в поток ostring, соответственно установив параметры форматирования с плавающей точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...