سؤال

أرغب في تخزين رقم مع 0.000 التالي وهو أفضل نوع بيانات للاستخدام.

مزدوج؟

كما أعتقد أن INT غير وارد؟

هل كانت مفيدة؟

المحلول

ال decimal النوع هو الأفضل للرياضيات النقطة الثابتة.

من القسم C# spec 4.1.7:

على عكس أنواع البيانات العائمة والبيانات المزدوجة ، يمكن تمثيل الأرقام الكسرية العشرية مثل 0.1 في التمثيل العشري. في التعويم والتمثيلات المزدوجة ، غالبًا ما تكون هذه الأرقام كسور لا حصر لها ، مما يجعل هذه العروض أكثر عرضة للأخطاء الدائرية.

نصائح أخرى

ما زلت من محبي العشري ، قد يستغرق الأمر مساحة أكبر قليلاً ولكن ليس لدي نفس أخطاء التقريب تطفو ومضاعفة.

يعتمد الأمر حقًا على نوع الدقة والدقة التي تحتاجها وأنواع الأرقام التي تتوقع تخزينها.

كما لو كنت تعمل بالمال ، فإن أخطاء التقريب في Float أو Real ربما ستكون غير مقبولة على أي حال.

بالطبع ، إذا كان ثابتًا تمامًا ، اعتمادًا على نطاق القيم المطلوبة ، يمكنك فقط الضرب بمقدار 1000 وتخزينه كنوع عدد صحيح مثل قصير.

مثال على خطأ ما من http://www.yoda.arachsys.com/csharp/floatingpoint.html

double a = 0.65d;  
double b = 0.05d;  
Console.WriteLine("{0:r}", a + b);  

لاحظ ال {0:r} من المهم عند الطباعة خلاف ذلك .NET ستجول القيمة وسيتم عرضها على أنها 0.7 على الرغم من أنها ليست بالضبط 0.7.

على العديد من الحسابات يمكن زيادة أخطاء التقريب هذه.

إذا كنت تتعامل مع عدد عشري الأرقام ، ومواصفاتك تتطلب دقة دقيقة لـ n عدد عشري الأماكن ، ثم خياراتك الوحيدة decimal, ، أو int/long مع التحجيم اليدوي (أي مضاعفة وتقسيم على 1000 حسب الحاجة عند القيام بالمدخلات/الإخراج والحساب). هذا الأخير أسرع ولديه تمثيل أكثر إحكاما ، والأول أبطأ وأوسع ، ولكن الكود أقصر وأكثر وضوحا. بالطبع ، يمكنك أيضًا تغليف جميع رمز Boilerplate ذو نقطة ثابتة بنفسك struct الذي يستخدم int/long تحت الغطاء.

لاتفعل استعمال float أو double. لا يمكنهم تمثيل العديد من الكسور العشرية بالضبط. يمكنك الابتعاد عن ذلك إذا كنت دائمًا ما يتجول باستمرار ، ولكن بمجرد أن تبدأ في إجراء حساب الحساب أو المقارنات ، قد يكون هذا (وعادة ما) يتجول لك ، لأن الأخطاء الدائرية تتراكم.

استنادًا إلى تعليقك على أن Yopu تمثل حجم الملف ، فكر في تخزين البايتات في عدد صحيح أو عدد صحيح طويل ... وهذا يتجنب مشكلتك تمامًا ، ويتجنب التقريب المتأصل في تحويل 1/1024 من كيلو بايت إلى مزدوج أو تعويم ولديه مزايا من الوجود أقرب إلى قياس العالم الحقيقي الذي تمثله.

نصيحتي هي ، استخدام الطفو. لمزيد من الدقة ، استخدم مزدوجًا ولمزيد من الدقة ، استخدم عشريًا.

تعويم هو 7 أرقام الدقة. مزدوج هو 15 رقم الدقة.

لذا فإن التعويم سيكون أكثر من كافية

int مثالي لك. سوف تضيع الذاكرة مع عشري ، وإذا كنت تستخدم 3 أماكن عشرية فقط ، فيمكنك على الإطلاق أن تتذكر/تقسيمها على 1000.

على أي حال ، يمكن أن يكون ذلك مرهقًا إذا كنت تستخدمه للبيانات المالية - ثم التمسك بعشرية على أي حال.

إذا كنت تستخدمه لنوع من الوحدات ، مثل المدة أو lenght ، فإن Int ستناسبك تمامًا ، لأنه يمكنك دائمًا الانتقال من ثوانٍ إلى ميلي ثانية ، أو من العداد إلى ملليمتر.

سيكون من المفيد إذا شرحت الاستخدام المطلوب لذلك.

أيضًا ، من المعلومات التي أراها في MSDN ، تشبه العشري تمامًا النقطة العائمة ، ولكن بدقة أكبر ودون تقريب.

علاوة على ذلك: عشري - 16 بايت ، int - 4 بايت

Howevery ، سيكون لديك int على 1000 نطاق فقط +/- 2،147،483

تعديل:

قرأت تعليقك وتريد استخدامها إذا لملفات؟ إذا كان الأمر كذلك ، فأنا لا أرى من أين تأتي العشرية ... ربما تكون فقط لغرض العرض؟

على أي حال ، اذهب مع int64 هنا.

إذا كان حجم الملف ، فيمكنك تغيير الحجم من كيلوبايت إلى بايت أو من نطاق أصغر (ميج إلى كيلو بايت) وأن تكون دون أي عائمة والحفاظ على نفس الدقة.

خلاف ذلك ، سيكون مزدوج جيد.

تعويم "دقيق" لحوالي 6 أماكن عشرية ، ومضاعفة "دقيقة" بدقة أعلى بكثير. ومع ذلك ، لا يمكن لأي منهما أن يمثل بدقة كل قيمة ثلاثية في مكان.

من المحتمل أن تكون على ما يرام باستخدام تعويم ، طالما أنك لا تمانع في تخزين رقم 0.123 ليتم تخزينه على أنه 0.122999999 ... يجب أن يكون هناك القليل من التقريب الدقيق لتحقيق ما تريد.

أذا أردت بالضبط تمثل جميع الكسور الممكنة من الأجزاء الثلاثية الممكنة ، فستكون أفضل حالًا باستخدام عدد صحيح وضرب القيم بمقدار 1000. أي أن قيمة 3.456 سيتم تخزينها في عدد صحيح كـ 3456.

هل تريد أن متجر الرقم بهذه الطريقة ، أو الحالي هو - هي؟ تخزين مع أكبر دقة يمكنك وتنسيقها إلى #.000. من غير المحتمل أن يكون تخزين أرقامك مشكلة تخزين ، لذا المضي قدماً واستخدم شيئًا كبيرًا جدًا.

كما يمكن أن تكون الأعداد الصحيحة المذكورة مناسبة للأشياء التي يمكن تقليلها إلى قيم عدد صحيح. (عرض GB ، بايت تخزين كـ int أو bigint ؛ أيام العرض ، تخزين ثواني كبيتينت)

بالنسبة لحجم الملف ، الذي يبدو أنه ما ترغب في تخزينه ، استخدم فترة طويلة (int64) لتخزين عدد البايتات. أو استخدم int إذا كنت تعرف أن الملفات ستكون أقل من حوالي 2 جيجابايت. يمكنك بعد ذلك قم بتحويل هذا إلى نموذج أكثر قابلية للقراءة البشرية باستخدام طريقة بسيطة.

سوف يكون تعويم أفضل.

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