سؤال

وأنا باستخدام جافا ويشير إلى نوع البيانات "مزدوج". للحفاظ عليه باختصار، أنا أقرأ بعض القيم من المدخلات القياسية التي قرأت في قانون بلدي كما الزوجي (أود أن كثير بدلا من استخدام شيء من هذا القبيل BigInteger ولكن في الوقت الراهن ليس من الممكن).

وأتوقع أن الحصول على قيم مزدوجة من المستخدم ولكن في بعض الأحيان قد الأشياء المدخلات مثل: +999999999999999999999999999.9999999999 وهو ما أعتقد أنه وراء تمثيل دقيق لمضاعفة والحصول على مقربة إلى 1.0E27 (على الأرجح).

وأود الحصول على بعض المؤشرات حول كيفية اكتشاف ما إذا كانت قيمة محددة لن تكون قادرة على أن تكون ممثلة بدقة في ضعف وتتطلب التقريب (كي أتمكن من رفض تلك القيمة أو غير ذلك من الإجراءات).

وشكرا جزيلا

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

المحلول

وومعظم القيم المدخلة من قبل البشر لا يكون للتمثيل بالضبط مع ضعف.

وعلى سبيل المثال، هل تريد منع المستخدم من دخول 0.1؟ هذا ليس للتمثيل تماما كما مزدوج.

لايجاد حجم الخطأ، هل يمكن أن تفعل شيئا مثل:

BigDecimal userAsDecimal = new BigDecimal(userInput);
double userAsDouble = double.parseDouble(userInput);
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble);
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs();

وثم تحقق ما إذا كان "خطأ" صغير محتمل.

نصائح أخرى

double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();

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

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