مكتوب بالكلمات السابقة:
اليوم ساعدت زميلي في حل مشكلة ، وهي أن هناك العديد من الأماكن العشرية التي تظهر عند ضرب العشرية. لقد واجهت هذه المشكلة من قبل ، لذلك سألخصها على وجه التحديد ؛
نوع الرقم:
نوع الرقم هو النوع الأكثر استخدامًا والأكثر إثارة للاهتمام في ECMASCRIPT ؛ يستخدم هذا النوع تنسيق IEEE754 لتمثيل الأعداد الصحيحة وقيم الفاصلة العائمة (قيم الفاصلة العائمة هي أيضًا قيم داعمة في بعض اللغات). لدعم أنواع البيانات المختلفة ، يحدد ECMA-262 تنسيقات سطح رقمية مختلفة.
عشري:
var intnum = 10 ؛ //عدد صحيح
أوكتال:
var octalnum1 = 070 ؛ // Octal 56
var octalnum2 = 079 ؛ // غير صالحة لحل القيمة الثمانية على أنها 79
الحرفية الثمانية غير صالحة في الوضع الصارم.
سداسي عشري:
var hexnum1 = 0xa ؛ // 10
تذكر: عند أداء العمليات ، يتم في النهاية تحويل جميع القيم المعبر عنها في الثمن والسداسي إلى العشرية ؛
لماذا يتمتع تشغيل الكسور بالأخطاء؟
أعلى التقدم في قيمة نقطة العائمة هو عشري من 17 رقمًا ، لكن دقتها أقل بكثير من تلك الموجودة في عدد صحيح عند إجراء العمليات ؛ سيتم تحويل الأعداد الصحيحة إلى عشري عند إجراء العمليات ؛ وعند حساب العمليات العشرية في Java و JavaScript ، سيتم تحويل العشرية العشرية أولاً إلى الثنائي المقابل ، ولا يمكن تحويل بعض العشرية إلى ثنائية تمامًا ، وبالتالي يحدث الخطأ الأول هنا. بعد تحويل كل العشرية إلى ثنائي ، يتم إجراء العمليات الثنائية للحصول على النتيجة الثنائية. ثم قم بتحويل النتيجة الثنائية إلى عشري ، ويحدث الخطأ الثاني عادة هنا.
لذلك (0.1+0.2)! = 03
حل:
رمز البرنامج
وظيفة التقسيم للحصول على نتائج الانقسام دقيقة
ملاحظة: ستكون هناك أخطاء في نتيجة التقسيم لـ JavaScript ، والتي ستكون أكثر وضوحًا عند تقسيم أرقام النقطة العائمة. هذه الوظيفة تُرجع نتيجة تقسيم أكثر دقة.
Call: Accdiv (Arg1 ، Arg2)
قيمة الإرجاع: النتيجة الدقيقة لـ Arg1 مقسومًا على Arg2
دالة accdiv (arg1 ، arg2) {var t1 = 0 ، t2 = 0 ، r1 ، r2 ؛ حاول {t1 = arg1.toString (). split (".") [1] .Length} catch (e) {} try {t2 = arg2.toString (). split (". r2 = number (arg2.toString (). استبدال (".إضافة طريقة DIV إلى نوع الرقم أكثر ملاءمة للاتصال.
number.prototype.div = function (arg) {return accdiv (this ، arg) ؛ }دالة الضرب للحصول على نتائج مضاعفة دقيقة
ملاحظة: ستكون هناك أخطاء في نتيجة الضرب لـ JavaScript ، والتي ستكون أكثر وضوحًا عند ضرب رقمين عائمين. هذه الوظيفة تُرجع نتيجة تكاثر أكثر دقة.
Call: Accmul (Arg1 ، Arg2)
قيمة الإرجاع: النتيجة الدقيقة لـ Arg1 مضروبة في Arg2
دالة accmul (arg1 ، arg2) {var m = 0 ، s1 = arg1.toString () ، s2 = arg2.toString () ؛ حاول {m+= s1.split (".تعد إضافة طريقة MUL إلى نوع الرقم أكثر ملاءمة للاتصال.
number.prototype.mul = function (arg) {return accmul (arg ، this) ؛}وظيفة الإضافة للحصول على نتائج إضافة دقيقة
ملاحظة: ستكون هناك أخطاء في نتيجة إضافة JavaScript ، والتي ستكون أكثر وضوحًا عند إضافة رقمين عائمين. هذه الوظيفة تُرجع نتيجة إضافة أكثر دقة.
Call: Accadd (Arg1 ، Arg2)
قيمة الإرجاع: النتيجة الدقيقة لـ Arg1 Plus Arg2
وظيفة Acadd (Arg1 ، Arg2) {var r1 ، r2 ، m ؛ حاول {r1 = arg1.toString (). split (".") [1] (Arg1*M+Arg2*M)/M}أضف طريقة إضافة إلى نوع الرقم ، مما يجعل الاتصال أكثر ملاءمة.
number.prototype.add = function (arg) {return accadd (arg ، this) ؛}قم بتضمين هذه الوظائف التي تريد استخدامها ، ثم اتصل بها لحسابها.
على سبيل المثال ، إذا كنت ترغب في حساب: 7*0.8 ، قم بتغييره إلى (7) .mul (8)
العمليات الأخرى متشابهة ، ويمكن الحصول على نتائج أكثر دقة.
الحل 2:
الأساليب الأكثر استخدامًا ، يمكن لطرق Tofixed () و tofixed () أن تدور حول عدد إلى أرقام برقم عشري محدد. إضافة هذه الطريقة بعد نتائج حسابنا على ما يرام ؛ ولكن سيكون لها تأثير بسيط على الدقة. إذا لم تكن متطلبات الدقة عالية ، فمن المستحسن استخدامها ؛