1. احسب باستخدام js
12.32*7 ما هي النتيجة؟ الجواب: 86.2400000000001
لماذا تحدث هذه المشكلة؟ كيفية حلها؟
يوجد خطأ في js عند التعامل مع ضرب وقسمة الكسور العشرية. يمكن أن يكون الحل: تحويل الكسور العشرية إلى أعداد صحيحة للمعالجة.
يمكن تغيير الحساب أعلاه إلى:
12.32*100*7/100
النتيجة هي: 86.24 صحيح.
قم أيضًا ببعض الحسابات:
8.80*100*12/100
النتيجة: 105.60000000000002
سوف تحدث مشاكل مماثلة مع 38.80.
زادت الدقة بمقدار 10 مرات:
8.80*1000*12/1000
النتيجة: 105.6
هذا طبيعي.
16.40*1000000*6/1000000
هناك أيضًا مشكلة في النتيجة
من أجل جعل تنفيذ js أكثر دقة، في حساب js العشري المستقبلي، قم بتوسيع القيمة مباشرة بمقدار 10000 مرة ثم قسمتها على 10000 لحل المشكلة.
فارنوم = 38.80؛
فار رقم 2 = 13؛
تنبيه (عدد * 10000 * 12 / 10000)؛
تم اختبار الرقم المراد ضربه وتقسيمه ووجد أنه 10,000 إذا كان أصغر ستسبب بعض الأرقام مشاكل وإذا كان أكبر (1,000,000) فإن بعض الأرقام ستسبب مشاكل أيضًا.
اثنين،
انسخ رمز الكود كما يلي:
<تأجيل البرنامج النصي>
Number.prototype.rate=function(){
varoStr=this.toString();
إذا (oStr.indexOf(".")==-1)
return1;
آخر
returnMath.pow(10,parseInt(oStr. length-oStr.indexOf(".")-1));
}
دالة تران (){
args=tran.arguments;
vartem=1;
ل(i=0;i<args.length;i++)
temp*=args[i]*args[i].rate();
ل(i=0;i<args.length;i++)
temp/=args[i].rate();
com.returntemp
}
تنبيه(تران(11,22.9));
</script>
هذا الحل أكثر تعقيدًا بعض الشيء، لكنه يمنحك فكرة عن العملية الفعلية لحل هذه المشكلة.
انسخ رمز الكود كما يلي:
// وظيفة القسمة، تُستخدم للحصول على نتائج قسمة دقيقة
// ملاحظة: ستكون هناك أخطاء في نتيجة قسمة JavaScript، والتي ستكون أكثر وضوحًا عند قسمة رقمين عائمين. تقوم هذه الدالة بإرجاع نتيجة قسمة أكثر دقة.
// اتصل: accDiv(arg1,arg2)
// قيمة الإرجاع: النتيجة الدقيقة لقسمة arg1 على arg2
دالة accDiv(arg1,arg2){
فار t1=0,t2=0,r1,r2;
حاول{t1=arg1.toString().split(".")[1].length}catch(e){}
حاول{t2=arg2.toString().split(".")[1].length}catch(e){}
مع (الرياضيات){
r1=Number(arg1.toString().replace("."،"))
r2=Number(arg2.toString().replace("."،"))
إرجاع (r1/r2)*pow(10,t2-t1);
}
}
// أضف طريقة div إلى نوع الرقم لتسهيل الاتصال به.
Number.prototype.div = الوظيفة (arg){
إرجاع accDiv(this, arg);
}
// دالة الضرب، تستخدم للحصول على نتائج ضرب دقيقة
// ملاحظة: ستكون هناك أخطاء في نتيجة الضرب لجافا سكريبت، والتي ستكون أكثر وضوحًا عند ضرب رقمين عائمين. تقوم هذه الدالة بإرجاع نتيجة ضرب أكثر دقة.
// اتصل: accMul(arg1,arg2)
// قيمة الإرجاع: النتيجة الدقيقة لضرب arg1 في arg2
الدالة accMul(arg1,arg2)
{
var m=0,s1=arg1.toString(),s2=arg2.toString();
حاول{m+=s1.split(".")[1].length}catch(e){}
حاول{m+=s2.split(".")[1].length}catch(e){}
رقم الإرجاع (s1.replace("."،"))*Number(s2.replace("."،"))/Math.pow(10,m)
}
// أضف طريقة متعددة إلى نوع الرقم لتسهيل الاتصال به.
Number.prototype.mul = الوظيفة (arg){
إرجاع accMul(arg, this);
}
// وظيفة الإضافة المستخدمة للحصول على نتائج إضافة دقيقة
// ملاحظة: ستحتوي نتيجة إضافة JavaScript على أخطاء، والتي ستكون أكثر وضوحًا عند إضافة رقمين عائمين. تقوم هذه الدالة بإرجاع نتيجة إضافة أكثر دقة.
// اتصل: accAdd(arg1,arg2)
// قيمة الإرجاع: النتيجة الدقيقة لـ arg1 بالإضافة إلى arg2
وظيفة إضافة (arg1، arg2) {
فار r1,r2,m;
حاول{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
حاول{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
م=Math.pow(10,Math.max(r1,r2))
العودة (arg1*m+arg2*m)/م
}
// أضف طريقة إضافة إلى نوع الرقم لتسهيل الاتصال به.
Number.prototype.add = الوظيفة (arg){
إرجاع accAdd(arg,this);
}