سؤال

أريد أن أفعل ما يقوله العنوان مثل هذا:

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 رقمًا أو أكثر من 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, ، بناءً على القيم التي تتطلع إليها ، تعرف على ما إذا كان ذلك متاحًا لك للاستخدام.

أشار آخرون إلى أن أرقام النقاط العائمة التقريب, ، لذلك لا يمكنك حقًا الحصول على عدد دقيق من الأرقام فيه.

ولكن ... يمكنك الحصول على شيء تقريبي ، من خلال كتابته إلى كائن STD :: StringStream ، ثم تحويله إلى Std :: String ، والحصول على سلسلة من السلسلة المذكورة. بالطبع يجب أن تتعامل مع حقيقة أنه قد يكون هناك أحرف غير رقمية في السلسلة (مثل علامة ناقص ، نقطة عشرية ، E للأسد وما إلى ذلك). كما يعتمد عدد الأرقام التي تحصل عليها بهذه الطريقة على خيارات التنسيق التي تختارها عند الكتابة إلى كائن StringStream. ولكن على افتراض أنك تعرف خيارات التنسيق التي ترغب في استخدامها ، يمكنك الحصول على عدد الأرقام الخاضعة لهذه الخيارات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top