سؤال

لماذا q == 0 في البرنامج النصي التالي؟

<script>
  var start = 1234567890123456789;
  var end =   1234567890123456799;
  var q = end - start;
  alert(q);
</script>

أعتقد أن النتيجة يجب أن تكون 10.ما هي الطريقة الصحيحة لطرح هذين الرقمين؟

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

المحلول

ولأن الأرقام في جافا سكريبت تطفو نقطة. لديهم محدودة الدقة.

وعندما يرى جافا سكريبت عددا طويلة جدا، وجولات إلى أقرب عدد أنها يمكن أن تمثل بمثابة تعويم 64 بت. في السيناريو الخاص بك، start وend الحصول على مقربة إلى نفس القيمة.

alert(1234567890123456789);   // says: 1234567890123456800
alert(1234567890123456799);   // says: 1234567890123456800

وليس هناك المدمج في طريقة للقيام الحساب الدقيق على أعداد صحيحة كبيرة، ولكن يمكنك استخدام BigInteger مكتبة مثل <وأ href = "http://www-cs-students.stanford.edu/~tjw/jsbn/ "يختلط =" noreferrer "> هذا واحد .

نصائح أخرى

وجيسون نشرت بالفعل لماذا. للحصول على حل، يمكنك الحصول على مكتبة جافا سكريبت BIGINT في HTTP: // www- cs-students.stanford.edu/~tjw/jsbn/

const subtract = (a, b) => [a, b].map(n => [...n].reverse()).reduce((a, b) => a.reduce((r, d, i) => {
    let s = d - (b[i] || 0)
    if (s < 0) {
        s += 10
        a[i + 1]--
    }
    return '' + s + r
}, '').replace(/^0+/, ''))

و
مكتبة استخدام كبير، صحيح أفضل لهذه الأمور وذلك للتعامل مع جميع حالات الاختبار المختلفة.

وهذا هو فقط للحالة العامة التي يمكن استخدامها ....

تم شرحه في وثائق جافا سكريبت:

وفقًا لمعيار ECMAScript، يوجد نوع واحد فقط من الأرقام: القيمة الثنائية ذات التنسيق الثنائي 64 بت ذات الدقة المزدوجة IEEE 754 (الأرقام بين -(253-1) و 253-1). لا يوجد نوع محدد للأعداد الصحيحة.

صفحة ويكيبيديا عن تنسيق النقطة العائمة مزدوج الدقة يشرح:

بين 252= 4,503,599,627,370,496 و 253= 9,007,199,254,740,992 الأرقام التي يمكن تمثيلها هي بالضبط الأعداد الصحيحة.للنطاق التالي، من 253 ل 254, ، كل شيء مضاعف 2, ، وبالتالي فإن الأرقام التي يمكن تمثيلها هي الأرقام الزوجية، وما إلى ذلك.

(جميع الأعداد الصحيحة أصغر من 252 يتم تمثيلها بالضبط.)

1234567890123456789 و 1234567890123456799 أكبر من 260= 1152921504606846976.عند هذا الحجم، يتم تخزين حوالي 1% فقط من الأعداد الصحيحة باستخدام تنسيق النقطة العائمة مزدوج الدقة.

لا يمكن تخزين هذين بالضبط.كلاهما مقرب إلى 1234567890123456800.


ال وثائق جافا سكريبت يشرح أيضًا كيفية معرفة ما إذا كان الرقم الصحيح مخزنًا بالضبط:

[...] والبدء بـ ECMAScript 6، يمكنك أيضًا التحقق مما إذا كان الرقم موجودًا في نطاق أرقام الفاصلة العائمة مزدوجة الدقة باستخدام Number.isSafeInteger() إلى جانب Number.MAX_SAFE_INTEGER و Number.MIN_SAFE_INTEGER.خارج هذا النطاق، لم تعد الأعداد الصحيحة في JavaScript آمنة وستكون عبارة عن تقريب مزدوج الدقة للقيمة.

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