Вопрос

Я хочу сделать то, что название говорит:

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

Но когда количество цифр - 11 и больше ответ всегда 7(6+1)

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

Это было полезно?

Решение

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

#include <iostream>
#include <numeric>

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

Дает мне :

2147483647

Другие советы

Типы данных с плавающей точкой, в том числе double, хранить приближение. Отказ Что вы найдете, позвонив log10 это количество мест слева от десятичной точки, который влияет самое большее по процессу приближения.

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

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

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

Вам нужно использовать либо 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, Также в зависимости от значений вы хотите работать, посмотрите, доступно ли вам для использования.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top