Вывести количество цифр после запятой c++

Необходимо вывести количество символов после запятой на C++. Пример: ввёл число 1.324234. Получил: 6 знаков после запятой. Ввёл 1.1. 1 знай после запятой.

Как такое сделать?


Ответы (2 шт):

Автор решения: Booch

Из-за проблем с числами с плавающей точкой, предложил бы вам решить это с помощью строк.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string num;
    cin >> num;

    int position = num.find(".");
    string afterDot = num.substr(position + 1);

    cout << afterDot.size() << endl;

    return 0;
}
→ Ссылка
Автор решения: Serge3leo

Если речь идет о числах с плавающей запятой, то надо точно сформулировать, что понимать "под количеством знаков после запятой". А именно:

  1. 0.00125, 1.25e+10, 12.5 - все имеют три значащие цифры или как-то иначе?
  2. Как относится к ошибкам округления?

Примеры возможных представлений в типе double:

  • 0.86 ≈ 0.85999999999999998;
  • 0.87 ≈ 0.86999999999999999;
  • 0.88 ≈ 0.88000000000000000;
  • 0.89 ≈ 0.89000000000000001;

Вариант кода для ответов "да, все имеют три значащие цифры" и "как обычно, ошибки округления не учитывать":

#include <cassert>
#include <iostream>
#include <iomanip>  // И это, ей Богу, клянусь! Последний раз,
                    // когда я пишу обращение к этому кривому пылесосу!
#include <limits>
#include <sstream>

using namespace std;

template<typename F>
unsigned num_digits(F x, 
            unsigned digits10 = numeric_limits<F>::digits10) {
    auto max_digits10 = numeric_limits<F>::max_digits10;
    ostringstream ss;

    ss << std::scientific << setprecision(max_digits10) << x << "\n.\n";

    auto s = ss.str();
    auto dpos = s.find("."); // TODO: std::numpunct<CharT>::decimal_point
    auto sad = s.substr(dpos, max_digits10);
    auto l = digits10;
    auto d = sad[l];

    if(d == '0' || d == '9') {
        while(0 < l && d == sad[l]) {
            --l;
        }
    }

    return l + 1;
}

typedef double ftype;

int main(int ac, char *av[]) {
    int p;

    if(ac <= 1 || 0 >= (p = atoi(av[1]))) {
        p = 1;
    }

    int n = 1;

    for(int i = 0; i < p; i++) {
        n *= 10;
    }

    for(int i = 0; i <= n; i++) {
        auto f = i/(ftype)n;
        auto nd = num_digits(f);
    
        assert(nd <= n);
        cout << f << " - " << nd << '\n';
    }

    return 0;
}
→ Ссылка