Question

je veux faire ce que dit le titre comme ceci:

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

mais quand le nombre de chiffres est de 11 et plus la réponse est toujours 7(6+1)

Est-ce que quelqu'un sait pourquoi ou ce que im-je tort?

Était-ce utile?

La solution

Qu'est-ce que « mauvais » est la valeur maximale qui peut être stocké dans un (signé) int:

#include <iostream>
#include <numeric>

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

Donne-moi:

  

2147483647

Autres conseils

Types de données à virgule flottante, y compris double, magasin approximations . Qu'est-ce que vous trouvez en appelant log10 est le nombre de places à gauche du point décimal , qui est affecté par au plus un par le processus de rapprochement.

La question que vous avez demandé, comment trouver le nombre de chiffres décimaux dans un numéro enregistré en virgule flottante binaire, n'a pas de sens. Le 7.1 numéro a deux chiffres décimaux, mais sa représentation à virgule flottante approximative n'utilise pas du tout les chiffres décimaux. Pour préserver le nombre de chiffres après la virgule, vous auriez besoin d'une représentation décimale, pas le type de données double C ++.

Bien sûr, tout cela est applicable uniquement à double, selon le titre de la question. Extrait de code n'utilise pas réellement double.

Vous exécutez passé la frontière 32 bits non signé ... votre numéro de 11 chiffres ou plus dépasse 0xFFFFFFFF et enroule donc autour.

Vous devez utiliser soit unsigned long long ou double pour votre variable 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;
}

Ces grand nombre imprimera en notation scientifique par défaut lorsque vous les envoyez à std::cout si vous choisissez d'utiliser double comme type de données, de sorte que vous voulez jeter un peu de mise en forme là-dedans. Si vous utilisez un unsigned long long à la place, ils imprimeront comme ils ont été inscrits, mais vous devez vous assurer que vos supports de plate-forme unsigned long long.

EDIT: Comme mentionné par d'autres, l'utilisation de valeurs à virgule flottante a d'autres conséquences à prendre en compte, et il est très probablement pas ce que vous essayez d'atteindre en fin de compte. Autant que je sache, le type intégral sur une plate-forme qui donne la plus grande valeur positive est unsigned long long, donc en fonction des valeurs que vous cherchez à travailler, voir si cela est à votre disposition pour l'utilisation.

D'autres ont fait remarquer que les nombres à virgule flottante sont approximations , de sorte que vous ne pouvez pas vraiment obtenir un décompte précis des chiffres en elle.

Mais ... vous pouvez obtenir quelque chose approximative, en l'écrivant sur un objet std :: stringstream, puis le convertir en un std :: string, et obtenir la longueur de ladite chaîne. Vous avez bien sûr de faire face au fait qu'il peut y avoir des caractères non-chiffres dans la chaîne (comme signe moins, point décimal, E pour l'exposant, etc.). De plus, le nombre de chiffres que vous obtenez de cette manière serait dépendre les options de formatage que vous choisissez lors de l'écriture à l'objet stringstream. Mais en supposant que vous savez ce que les options de formatage que vous souhaitez utiliser, vous pouvez obtenir le nombre de chiffres soumis à ces options.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top