سؤال

هذه الخطوط في ج #

decimal a = 2m;
decimal b = 2.0m;
decimal c = 2.00000000m;
decimal d = 2.000000000000000000000000000m;

Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);

يولد هذا الإخراج:

2
2.0
2.00000000
2.000000000000000000000000000

لذلك أستطيع أن أرى أن إنشاء متغير عشري من حرفي يسمح لي بالتحكم في الدقة.

  • هل يمكنني ضبط دقة المتغيرات العشرية دون استخدام الحرفيين؟
  • كيف يمكنني إنشاء B من؟ كيف يمكنني إنشاء ب من ج؟
هل كانت مفيدة؟

المحلول

تم تقديم الحفاظ على الأصفار الزائدة مثل هذا في .NET 1.1 لمزيد من المطابقة الصارمة مع مواصفات ECMA CLI.

هناك بعض المعلومات حول هذا على MSDN، على سبيل المثال هنا.

يمكنك ضبط الدقة على النحو التالي:

  • الرياضيات (أو السقف، الكلمة، إلخ) لتقليل الدقة (ب من ج)

  • اضرب بنسبة 1.000 ... (مع عدد الكسور العشرية التي تريدها) لزيادة الدقة - على سبيل المثال مضاعفة بنسبة 1.0 متر للحصول على B من A.

نصائح أخرى

أنت فقط ترى تمثيلات مختلفة من نفس البيانات بالضبط. دقة أ decimal سيتم تحجيمها لتكون كبيرة كما يجب أن تكون (ضمن سبب).

من System.Decimal:

الرقم العشري هو قيمة عائمة تتألف من علامة، قيمة رقمية حيث يتراوح كل رقم في القيمة من 0 إلى 9، و عامل التحجيم الذي يشير إلى موقف نقطة عشرية عائمة يفصل الأجزاء المتكاملة والكسرية من القيمة الرقمية.

يتكون التمثيل الثنائي للقيمة العشرية من علامة 1 بت، وعدد صحيح 96 بت، وعامل التحجيم يستخدم لتقسيم عدد صحيح 96 بت وحدد جزء منه هو جزء كبير من هذا الكسر العشري. عامل التحجيم ضمنيا الرقم 10، الذي رفعه إلى الأسترال الذي تتراوح من 0 إلى 28. وبالتالي، فإن التمثيل الثنائي للقيمة العشرية هو النموذج (-296 إلى 296) / 10(من 0 إلى 28))، حيث -296-1 يساوي minvalue، و 296-1 يساوي maxvalue.

يحافظ عامل التحجيم أيضا على أي أصفاء زائدة في عدد عشري. لا تؤثر الأصفار الزائدة على قيمة رقم عشري في عمليات حسابية أو مقارنة. ومع ذلك، يمكن الكشف عن الأصفار الزائدة عن طريق طريقة Tostring إذا تم تطبيق سلسلة تنسيق مناسبة.

لقد وجدت أنني يمكن أن "العبث" بالحجم بضرب أو تقسيم من قبل الهوى 1.

decimal a = 2m;
decimal c = 2.00000000m;
decimal PreciseOne = 1.000000000000000000000000000000m;
  //add maximum trailing zeros to a
decimal x = a * PreciseOne;
  //remove all trailing zeros from c
decimal y = c / PreciseOne;

يمكنني تصنيع 1 دقيقة بما فيه الكفاية لتغيير عوامل الحجم من قبل الأحجام المعروفة.

decimal scaleFactorBase = 1.0m;
decimal scaleFactor = 1m;
int scaleFactorSize = 3;

for (int i = 0; i < scaleFactorSize; i++)
{
  scaleFactor *= scaleFactorBase;
}

decimal z = a * scaleFactor;

من المغري الخلط decimal في SQL Server مع decimal في الشباك؛ إنها مختلفة تماما.

خادم SQL. decimal هو رقم نقطة ثابتة يتم إصلاح دقةها ومقياسها عند تعريف العمود أو المتغير.

شبكة decimal هو رقم نقطة عائمة مثل float و double (الفرق يجري ذلك decimal يحافظ بدقة عن أرقام عشرية في حين float و double الحفاظ بدقة على الأرقام الثنائية). محاولة للتحكم في دقة .NET decimal من غير المجدي، لأن جميع الحسابات ستؤدي إلى نفس النتائج بغض النظر عن وجود أو عدم وجود الأصفار الحشو.

والسؤال هو - هل تحتاج حقا الدقة مخزن في العشرية، بدلا من مجرد عرض العشرية الدقة المطلوبة. تعرف معظم التطبيقات داخليا مدى دقة أنهم يريدون أن يكونوا ويعرضون إلى هذا المستوى من الدقة. على سبيل المثال، حتى إذا دخل المستخدم فاتورة إلى 100 في حزمة حسابات، فلا يزال يطبع على أنه 100.00 باستخدام شيء مثل Val.Toststring ("N2").

كيف يمكنني إنشاء B من؟ كيف يمكنني إنشاء ب من ج؟

ج إلى ب ممكن.

Console.WriteLine(Math.Round(2.00000000m, 1)) 

تنتج 2.0.

A إلى B صعبة مثل مفهوم إدخال الدقة هو الغريبة قليلا للرياضيات.

أعتقد أن الاختراق الرهيبة قد تكون رحلة ذهابا وإيابا.

decimal b = Decimal.Parse(a.ToString("#.0"));
Console.WriteLine(b);

تنتج 2.0.

سيؤدي ذلك إلى إزالة جميع الأصفار الزائدة من العشرية ثم يمكنك فقط استخدام ToString().

public static class DecimalExtensions
{
    public static Decimal Normalize(this Decimal value)
    {
        return value / 1.000000000000000000000000000000000m;
    }
}

أو بدلا من ذلك، إذا كنت تريد عددا دقيقا من الأصفار الزائدة، قل 5، أولا تطبيع () ثم اضرب 1.00000 متر.

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