Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/179: Рейтинг темы: голосов - 179, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 6
1

Подсчитать количество цифр после запятой в вещественном числе

23.05.2014, 13:53. Показов 35051. Ответов 21
Метки нет (Все метки)

Доброго времени суток. Подскажите, пожалуйста, как посчитать кол-во цифр после запятой?
Например в числе 5.4569 -4 знака после запятой. В программе присутствуют как все число n=5.4569,так и дробная часть n1=0.4569.
Заранее спасибо
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2014, 13:53
Ответы с готовыми решениями:

Количество цифр в вещественном (!) числе
Всем привет! Пытаюсь решить такую задачу, но для дробных чисел ничего не получается :( С целыми...

Определить количество значимых цифр в вещественном числе со знаком
Дано вещественное число, определить количество значимых цифр в вещесвенном числе со знаком.

Нужно отделить цифры после запятой в вещественном числе
То есть, если дано число 567,34 нужно выделить 34. Есть идея перевести вещественное число в строку,...

Оставить одну цифру, после запятой, в вещественном числе
Скажите пожалуйста как оставить одну цифру в вещественном числе, после запятой, если есть команда....

21
Заблокирован
23.05.2014, 13:55 2
перегоняй в строку, находи в строке '.' и считай кол-во буковок (циферок в данном случае) посл точки до конца строки
0
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 6
23.05.2014, 13:57  [ТС] 3
С помощью чего это делать? size()?strlen()?Чего именно?
0
zzzZZZ...
526 / 357 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
23.05.2014, 14:06 4
Цитата Сообщение от Kolter Посмотреть сообщение
С помощью чего это делать? size()?strlen()?Чего именно?
itoa();
0
61 / 42 / 20
Регистрация: 28.09.2013
Сообщений: 193
23.05.2014, 14:15 5
dzrkot, itoa() переводит только из int не?
0
1453 / 790 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
23.05.2014, 14:20 6
Цитата Сообщение от Kolter Посмотреть сообщение
Например в числе 5.4569 -4 знака после запятой
Это только так кажется:
C++
1
2
3
4
5
6
7
8
int main()
{
   double d = 5.1234;
   std::cout << d << "\n"; //5.1234
   std::cout << std::setprecision(60) << d << "\n"; //5.123400000000000176214598468504846096038818359375
 
   return 0;
}
1
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 6
23.05.2014, 14:26  [ТС] 7
Ого.Это конечно интересно. Но надо чтобы выводил 4.И c itoa() я совсем запуталась в конверсиях( оба числа типа double. на какой тип конвертировать)
0
Заблокирован
23.05.2014, 14:27 8
Лучший ответ Сообщение было отмечено Kolter как решение

Решение


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <tchar.h>
#include <iostream>
#include <iomanip> 
#include <sstream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    double number = 3.145926535;    
    std::stringstream ss;
    ss << std::setprecision(15) <<  number;
    std::string strNum = ss.str();
    size_t pos = strNum.find('.');
    if(pos != strNum.npos)          
        std::cout << "Number of digits after comma: " << strNum.size() - 1 - pos << std::endl;  
    else
        std::cout << "Comma not found!" << std::endl;
 
    return 0;   
}
0
0 / 0 / 0
Регистрация: 18.01.2014
Сообщений: 6
23.05.2014, 14:43  [ТС] 9
newbie666, спасибо, посижу,поразбираюсь

Добавлено через 10 минут
Отлично все работает, огромное вам спасиииибо
0
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 866
Записей в блоге: 10
23.05.2014, 15:03 10
DiffEreD, Оооо !
такая точность ? откуда

больше 15 знаков не канает

Добавлено через 2 минуты
у моей машины
1
2 / 2 / 0
Регистрация: 03.06.2019
Сообщений: 62
23.08.2019, 21:47 11
Вот в-я, которая считает вполне нормально, но иногда долго:
C++
1
2
3
4
5
6
7
8
9
10
int Foo(double d) {
    int test = (int)d;
    int count = 0;
    while (test != d) {
        count++;
        d*=10;
        test = (int)d;
    }
    return count;
}
0
Эксперт C
26093 / 16280 / 3497
Регистрация: 24.12.2010
Сообщений: 35,687
23.08.2019, 22:24 12
Для справки.
У переменной типа double нет количества знаков после точки. Просто такое понятие для него не определено.
Оно есть только у его текстового представления.
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,276
Записей в блоге: 16
23.08.2019, 23:33 13
Цитата Сообщение от Байт Посмотреть сообщение
У переменной типа double нет количества знаков после точки.
Байт, вот страничка:
https://ru.wikipedia.org/wiki/IEEE_754-2008
Поскольку внутреннее представление 2-чное то в десятичном представлении 64 битное (дабл) по стандарту будет иметь 15-16 разрядов в мантиссе. Они пишут 15.95 (53 двоичных разряда дают то 15 то 16 10-тичных, в зависимости от значения !).
Вопрос топика, недоизучен ТС и требует уточнения формулировки.

Добавлено через 2 минуты
NuMeRiC_, как вам удалось раскопать 2014 год? Раритет как-никак...
1
Эксперт C
26093 / 16280 / 3497
Регистрация: 24.12.2010
Сообщений: 35,687
24.08.2019, 09:45 14
Цитата Сообщение от IGPIGP Посмотреть сообщение
53 двоичных разряда дают то 15 то 16 10-тичных,
Зерно истины в этом есть. Но тогда и вопрос должен был быть поставлен по другому. Сколько десятичных знаков имеет тип double?
Хотя... Там говорится о знаках после запятой.... Значит для числа 5.4569 это будет 15(16) - 1 = 14(15)
Что брать за "базу" - 15 или 16 - вопрос достаточно тонкий.
Но таких "задач" на форуме встречалось довольно много. Что я отношу к идиотизму не столько ТС-ов, сколько преподавателей, слабо разбирающихся в данном вопросе.

Добавлено через 6 минут
В свое время мне пришлось создавать функцию "точного" представления плавающих чисел. Сделал просто. ПЕреводил в строку (sprinf(s, "%19f", d); и искал идущие подряд "000" или "999", которые отсекал. Числа 19 и 5 были назначены чисто волюнтаристски. Но заказчик был доволен и не брыкался
1
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,276
Записей в блоге: 16
24.08.2019, 11:57 15
Цитата Сообщение от Байт Посмотреть сообщение
Но тогда и вопрос должен был быть поставлен по другому.
Конечно! Я же и говорю:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вопрос топика, недоизучен ТС и требует уточнения формулировки.
Цитата Сообщение от Байт Посмотреть сообщение
Но таких "задач" на форуме встречалось довольно много. Что я отношу к идиотизму не столько ТС-ов, сколько преподавателей, слабо разбирающихся в данном вопросе.
Мир удивительно стабилен, в некоторых своих проявлениях.
Цитата Сообщение от Байт Посмотреть сообщение
Там говорится о знаках после запятой.... Значит для числа 5.4569 это будет 15(16) - 1 = 14(15)
Что брать за "базу" - 15 или 16 - вопрос достаточно тонкий.
По примеру топика речь о знаках в мантиссе вида a.bcde... где a - не ноль. А недетерминированное в числе знаков 10-чное представление проще всего решить отбросив 16. То есть, для 64-представления IEEE754 уверенно можно говорить о 15 для мантиссы. Так кажется. И три знака для экспоненты + знак самой экспоненты и знак числа экспоненты (песня, название песни, то о чём песня и звучащая песня). То есть e-301 - четыре знака. Стало быть строка для представления в char должна быть не менее 20=15+4 +1. Один - для десятичной точки. Но это для мантиссы с точкой и без ведущего нуля. То есть для человеческого глаза. А в формате где ноль - ведущий (в мантиссе вида 0.bcde...) перед первой значащей (не нулевой) после запятой, можно на точке съэкономить. Но не всем будет понятно.

Добавлено через 44 минуты
Байт, учитывая сказанное, я бы ответил на вопрос ТС так:
Нужно получить столько значащих из матиссы сколько возможно. То есть, например, отбрасываем экспоненту и анализируем 15 ведущих знаков мантиссы для того чтобы выбросить сплошную, замыкающую группу нулей (если есть хоть один, - уже один знак отбросим). Тогда можно получить менее 15 10-чных цифр (значащих уже можно сказать) не изменив точность (с точностью до 16-го знака в некоторых случаях).
То есть, если быть предельно точным, то нельзя быть предельно точным )))
1
Эксперт C
26093 / 16280 / 3497
Регистрация: 24.12.2010
Сообщений: 35,687
24.08.2019, 23:51 16
Копая нонче картошку на огороде (а она выдалась на диво - с кулак!), пришел, как мне кажется, к разумному решению. Что-то вроде этого
C++
1
2
3
4
char s[100];
cin >> s;
char *p = strchr(s, '.');
int Kz = strlen(p) - 1;
Конечно, для полного тахащусса надо добавить некоторые проверки. Но суть в том, что нам дается представление числа, вот с ним и надо работать. И это - просто.
1
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,276
Записей в блоге: 16
25.08.2019, 00:06 17
Цитата Сообщение от Байт Посмотреть сообщение
Конечно, для полного тахащусса надо добавить некоторые проверки.
Да. Это точно. Вот допустим число выглядит так: 1.05808786500000e-305
То есть, я бы десятичный логарифм взял. Потом получил чистую мантиссу: 1.05808786500000. А потом уже проанализировал и отбросил 5 последних нулей: 1.058087865 и затем уже вернул порядок на место 1.058087865e-305.
Ведь речь то может идти только о строковом десятичном представлении (моё предположение). Внутренне представление останется двоичным, а десятичное, числовое, всё едино будет дополнено нулями справа до 15 или 16 общих штук.
1
Эксперт C
26093 / 16280 / 3497
Регистрация: 24.12.2010
Сообщений: 35,687
25.08.2019, 00:27 18
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ведь речь то может идти только о строковом десятичном представлении (моё предположение)
Золотые слова ваши! Но только эти. Имхо, все остальное к делу никакого касательства не имеют. И нули вы зря отбрасываете. Зачем? Ваше число имеет 305+15 = 320 знаков после запятой (если я не ошибся,, считая ваши циферки)
Мы анализируем только написанное, и нам плевать на то, что делает с этим комп, как он там разбирается с числом. Наше дело - строка. И более ничего.

Добавлено через 5 минут
IGPIGP, Понимаете, если написано 1.00000, то тут именно 5 знаков после запятой. И "в быту" это говорит о том, что измерения произведены именно с этой точностью.
1
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,276
Записей в блоге: 16
25.08.2019, 01:21 19
Цитата Сообщение от Байт Посмотреть сообщение
если написано 1.00000, то тут именно 5 знаков
Это как раз я и сказал там, где вы увидели золотые слова. То есть, смысл вопроса:
Цитата Сообщение от Kolter Посмотреть сообщение
Подскажите, пожалуйста, как посчитать кол-во цифр после запятой?
может присутствовать лишь если речь идёт о значащих цифрах. Последняя группа нулей к ним не относится и может быть отброшена. Это имеет смысл только в строковом представлении.
А в компьютерном, даже ноль имеет 14(или 15?) знаков после запятой в мантиссе. И все нули, да. Это не удивительно. Ибо на этом зиждется храм бытия.
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,276
Записей в блоге: 16
25.08.2019, 08:19 20
И ещё. Вот это
Цитата Сообщение от Байт Посмотреть сообщение
Мы анализируем только написанное, и нам плевать на то, что делает с этим комп
преувеличение. Программирование и математика порождают разные абстракции на одной и той же словарной (терминологической) базе. Тут важно, что имеет в виду человек, задающий тему. У ТС
Цитата Сообщение от Kolter Посмотреть сообщение
В программе присутствуют как все число n=5.4569,так и дробная часть
То есть, речь о типе данных с плавающей точкой (мы не знаем float или double или long double - вот это таки плохо) но не о числах с математической точки зрения. Мат-абстракция числа не имеет конечного представления в общем случае, не выражаемого функционально. Число Пи легко можно выразить как отношение длины окружности к диаметру, например. На этом легкость и заканчивается.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2019, 08:19

Как посчитать количество цифр в числе после запятой
есть число 3.45678 как посчитать числа после запятой т.е. 5

В строке имеется одна точка с запятой. Подсчитать количество символов до точки с запятой и после неё
В строке имеется одна точка с запятой. Подсчитать количество символов до точки с запятой и после...

В строке имеется одна точка с запятой (;). Подсчитать количество символов до точки с запятой и после нее.
В строке имеется одна точка с запятой ( ; ). Подсчитать количество символов до точки с запятой и...

Функция: подсчёт количества цифр после запятой в дробном числе
Нужно написать функцию подсчёта количества цифр после запятой в дробовом числе и при этом не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.