1. استخدم JS للحساب
12.32 * 7 ما هي النتيجة؟
الإجابة: 86.240000000000001
لماذا تحدث هذه المشكلة؟ كيف تحلها؟
هناك خطأ عندما يتعامل JS مع الضرب وتقسيم العشرية. يمكن أن يكون الحل: حول العشري إلى عدد صحيح للتعامل معه.
يمكن تغيير الحساب أعلاه إلى:
12.32 * 100 * 7/00
والنتيجة هي: 86.24 ، صحيح.
دعنا نحسبها مرة أخرى:
8.80 * 100 * 12/00
النتيجة: 105.60000000000002
ستحدث مشاكل مماثلة في 38.80.
زيادة الدقة بمقدار 10 مرات:
8.80 * 1000 * 12/1000
النتائج: 105.6
إنه طبيعي.
16.40 * 1000000 * 6/1000000
هناك مشاكل مع النتيجة
من أجل جعل تنفيذ JS أكثر دقة ، يمكن توسيع القيمة مباشرة بمقدار 10000 مرة في حساب JS العشري اللاحق ، ثم مقسومًا على 10000 لحل المشكلة.
var num = 38.80 ؛
var num2 = 13 ؛
تنبيه (num * 10000 * 12/10000) ؛
الرقم مضروب ومقسم على 10000 هو الأنسب للاختبار. تواجه بعض الأرقام مشاكل عندما تكون أصغر ، وبعض الأرقام تعاني من مشاكل عندما تكون أكبر (1000،000).
اثنين،
<script> number.prototype.rate = function () {varostr = this.toString () ؛ if (ostr.indexof (".") ==-1) return1 ؛ functionTran () {args = tran.arguments ؛ vartemp = 1 ؛ for (i = 0 ؛ i <args.length ؛ i ++) temp*= args [i]*args [i] .rate () ؛ for (i = 0 ؛ i <args.length ؛ i ++) temp/= args [i] .rate () ؛ </script>هذا الحل هو حل أكثر تعقيدًا ، ولكنه يمكن أن يمنحك فهمًا تقريبيًا للعملية الفعلية لحل هذه المشكلة.
// يتم استخدام وظيفة الفجوة للحصول على نتائج دقيقة للتقسيم // ملاحظة: ستكون هناك أخطاء في نتيجة التقسيم لـ JavaScript ، والتي ستكون أكثر وضوحًا عند تقسيم أرقام النقطة العائمة. هذه الوظيفة تُرجع نتيجة تقسيم أكثر دقة. // call: accdiv (arg1 ، arg2) // قيمة الإرجاع: النتيجة الدقيقة لـ Arg1 مقسومة على Arg2 AccDiv (arg1 ، arg2) {var t1 = 0 ، t2 = 0 ، r1 ، r2 ؛ حاول {t1 = arg1.toString (). split (".") [1] th} catch (e) {} with (math) {r1 = number (arg1.toString (). استبدال ("." ، ")) r2 = number (arg2.toString (). استبدال (". "،")) (R1/R2)*POW (10 ، T2-T1) ؛}} // إضافة طريقة 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 (".") [1] .Length} catch (e) {} try {m+= s2.split (".") [1] الرقم (s1.replace (". number.prototype.mul = function (arg) {return accmul (arg ، this) ؛} // يتم استخدام وظيفة الإضافة للحصول على نتائج إضافة دقيقة // ملاحظة: ستكون هناك أخطاء في نتيجة إضافة JavaScript ، والتي ستكون أكثر وضوحًا عند إضافة رقمين تعويم. هذه الوظيفة تُرجع نتيجة إضافة أكثر دقة. // call: accadd (arg1 ، arg2) // قيمة الإرجاع: النتيجة الدقيقة لوظيفة Arg1 Plus Arg2 Accadd (Arg1 ، Arg2) {var R1 ، R2 ، M ؛ Try {R1 = Arg1.ToString (). split (".") [1] (Arg1*M+Arg2*M)/M} // إضافة طريقة إضافة إلى نوع الرقم ، مما يجعل الاتصال أكثر ملاءمة. number.prototype.add = function (arg) {return accadd (arg ، this) ؛}إن معالجة خطأ الضرب العشرية JavaScript أعلاه هي كل المحتوى الذي شاركته معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.