Вывести количество цифр после запятой 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
→ Ссылка
Если речь идет о числах с плавающей запятой, то надо точно сформулировать, что понимать "под количеством знаков после запятой". А именно:
- 0.00125, 1.25e+10, 12.5 - все имеют три значащие цифры или как-то иначе?
- Как относится к ошибкам округления?
Примеры возможных представлений в типе 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;
}