سؤال

أواجه بعض القضية الغريبة هنا. لدي جدول قاعدة بيانات له قيمة ضخمة مخزنة على عمود. تطبيقي (C #) هو قراءة هذه القيمة والحفاظ عليها في مزدوج اكتب. سيقوم هذا التطبيق بإدخال نفس القيمة إلى جدول آخر. ملاحظة: لا أفعل أي حسابات / معالجة حول القيمة قراءة من الجدول الأول. يتم الاحتفاظ فقط لتحديث الجدول الثاني.

المشكلة هنا هي أن الجدول الثاني يحصل على قيمة مختلفة قليلا مما كانت عليه في الجدول الأول. يبدو أن الرقم يقسم عند الاحتفاظ به في النوع المزدوج.

هنا مثال على القيم.

القيمة الأصلية : 18014398509481984

نسخ القيمة إلى جدول جديد: 18014398509482000

تبدو القيم مختلفة، ولكن كلاهما نفسه في الواقع. فعلت بحث جوجل مع 18014398509481984 - 18014398509482000 كصطلح بحث وعاد النتيجة 0, وهذا يعني كلاهما نفسه.

أسئلة:

1 - إذا كانت كلاهما كذلك، فلماذا تبدو القيمة الثانية مختلفة؟ يمكنني ان ارى 1984 تحولت 2000.

2 - لماذا يحدث التحويل؟

3 - كيف يمكنني تجنب هذا النوع من التحويلات؟

أي مساعدة ستكون رائعة!

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

المحلول

حاول استخدام أ System.Decimal لتخزين القيمة من الجدول الأول، بدلا من System.Double. System.Double لا يبدو أنه يحتوي على أرقام مهمة كافية لتخزين هذا القيمة الكبيرة بدقة.

نصائح أخرى

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

إذا حصلت على قيمة خارج SQL، فتأكد من أن نوع البيانات المستهدف الخاص بك في مباريات .NET - SQL Bigint for C # لفترة طويلة على سبيل المثال - لتجنب تقريب مشكلات مثل هذا.

أعتقد أن هذا بسبب دقة النقطة العائمة (العدد الكبير سيستخدم Mantissa Arponent)، مما يعني أنه سيمثل بشكل أساسي كرقم فعال مع قوة. ومع ذلك، فإن الأرقام الكسرية تصادف أخطاء تقريب بسبب الحساب العائم.

عادة ما تكون الطريق جولة هذا لتجنب قيم النقطة العائمة (جرب Int64)، استخدم نوعا أكثر دقة (عشرية) أو حساب الخطأ والقيام ب "مساوية تقريبا".

هل تحتاج إلى تخزين هذه كأرقام النقطة العائمة؟

إذا لم يكن الأمر كذلك، فيمكنك استخدام أعداد صحيحة 64 بت بدلا من ذلك: BIGINT في قاعدة البيانات، و long/Int64 في التطبيق الخاص بك.

هذه لديها مجموعة من -9،223،372،036،036،775،808،808،808 9،223،372،036،854،808،807،775،807 وليس قضايا الدقة / الدقة.

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