C ++ подсчитать количество цифр двойного - PullRequest
2 голосов
/ 02 декабря 2010

я хочу сделать то, что написано в заголовке так:

int number1;
cin>>number1;
num1len=log10(number1)+1;
cout<<"num of digits is "<<num1len<<"\n";

но если число цифр равно 11 и более, ответ всегда будет 7(6+1)

Кто-нибудь знает почему или что я делаю неправильно?

Ответы [ 4 ]

8 голосов
/ 02 декабря 2010

Типы данных с плавающей запятой, включая double, хранилище аппроксимации .По номеру log10 вы находите число мест слева от десятичной точки , на которое влияет не более одного процесса аппроксимации.

Вопрос, который вы задаетеСпрашивать, как найти количество десятичных цифр в числе, хранящемся в двоичной с плавающей запятой, бессмысленно.Число 7.1 имеет две десятичные цифры, однако его приблизительное представление с плавающей точкой вообще не использует десятичные цифры.Чтобы сохранить количество десятичных цифр, вам понадобится некоторое десятичное представление, а не тип данных C ++ double.

Конечно, все это применимо только к double в заголовке вопроса.Ваш фрагмент кода на самом деле не использует double.

4 голосов
/ 02 декабря 2010

Что является «неправильным», так это максимальное значение, которое может быть сохранено в (со знаком) int:

#include <iostream>
#include <numeric>

int main()
{
    std::cout << std::numeric_limits<int>::max() << std::endl;
}

Дает мне:

2147483647

2 голосов
/ 02 декабря 2010

Вы бежите за 32-разрядную границу без знака ... ваше число из 11 или более цифр превышает 0xFFFFFFFF, и поэтому оно повторяется.

Вам необходимо использовать либо unsigned long long, либо double дляваша number1 переменная:

#include <iostream>
#include <cstdlib>
#include <cmath>

int
main ( int argc, char * argv[] )
{
  unsigned long long num; // or double, but note comments below
  std::cin >> num;
  std::cout << "Number of digits in " << num << " is " << ( (int) std::log10 ( num ) + 1 ) << std::endl;
  return 0;
}

Эти большие числа будут напечатаны в научной нотации по умолчанию при отправке их на std::cout, если вы решите использовать double в качестве типа данных, поэтому вы захотитебросить некоторое форматирование там.Если вместо этого вы используете unsigned long long, они будут печататься так, как они были введены, но вы должны быть уверены, что ваша платформа поддерживает unsigned long long.

РЕДАКТИРОВАТЬ: Как уже упоминалось, использование значений с плавающей запятой имеетдругие последствия, чтобы рассмотреть, и, скорее всего, не то, что вы в конечном итоге пытаетесь достичь.AFAIK, интегральный тип на платформе, который дает наибольшее положительное значение, составляет unsigned long long, поэтому в зависимости от значений, с которыми вы хотите работать, посмотрите, доступен ли он для использования.

0 голосов
/ 02 декабря 2010

Другие отметили, что числа с плавающей запятой приблизительно , поэтому вы не можете получить точное количество цифр в них.

Но ... вы можете получить что-то приблизительное, записав это в объект std :: stringstream, затем преобразовав его в std :: string и получив длину указанной строки.Вам, конечно, придется иметь дело с тем фактом, что в строке могут быть нецифровые символы (например, знак минус, десятичная точка, E для показателя степени и т. Д.).Также количество цифр, которое вы получите таким образом, будет зависеть от параметров форматирования, которые вы выбираете при записи в объект stringstream.Но, предполагая, что вы знаете, какие параметры форматирования вы хотели бы использовать, вы можете получить количество цифр, соответствующих этим параметрам.

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