آیا این یک باگ در اکشن اسکریپت است؟

splinter cell

Well-Known Member
سلام رفقا
این دستور رو اجر کنید
کد:
trace(8.4 * 0.001);
جواب باید0.0084 باشه.ولی در کمال تعجب جواب رو 0.008400000000000001میزنه.خلاصه کل محاسباتم بهم ریخته. نظر شما چیه؟ راه حلی داره؟
 

mahsky

Member
سلام رفقا
این دستور رو اجر کنید
کد:
trace(8.4 * 0.001);
جواب باید0.0084 باشه.ولی در کمال تعجب جواب رو 0.008400000000000001میزنه.خلاصه کل محاسباتم بهم ریخته. نظر شما چیه؟ راه حلی داره؟

این طوری جواب میده
[JSS]
var a:Number = 0;
a = Math.floor((8.4*0.001)*10000000)/10000000;
trace(a);
[/JSS]

یا اینکه
a = (8.4*1000*0.001*1000)/1000000

یه سوال کار های گرافیکی کار هاتو خودت انجام میدهی(با برنامه فلش) آخه خیلی قشنگن!
 
آخرین ویرایش:

mmz2006

Active Member
به نظرم این یک باگ نیست بلکه ضعف دقت نوع نامبر در اکشن اسکریپت است.

با تشکر از mahsky عزیز ولی استفاده از floor در برخی جاها اشتباه عمل می کند چون به سمت عدد پایین گرد می کنه، مثل این : 8.2 * 0.001

روش دومت درست عمل می کنه.

راه حل دیگه، در لینک زیر که کدش رو هم نوشتم .

How to deal with Number precision in Actionscript?

PHP:
var r = 8.4 * 0.001 ;

var toFixed:Function = function(number:Number, factor:Number) {
    return (Math.round(number * factor)/factor);
}

trace(r);
trace(toFixed(r, 10000));
 
آخرین ویرایش:

splinter cell

Well-Known Member
ممنون
این عدد 10000000رو بر چه اساس نوشتید؟
چون مسئله اینه که عددهای من بطور تصادفی تولید میشن و بازم برای بعضیها همون مشکل بوجود میاد ولی بجای 000000 از 999999 توی آخر عدد تولید میشه.
 

mahsky

Member
سلام
منظورون اینه که مثلا حاصل ضرب 0.1*0.1 میشه 0.01999999(این یک فرض هست )
برای رفع این مشکل از راه دوم استفاده کنید.
چون شما استادی در ریاضیات هستید من این را برای دیگران توضیح میدهم.(تا همه بفهمند)

عدد 0.1 را میتوانیم به صورت کسر بنویسیم 1/10
مثال:
عدد 11.25 =>1125/100
عدد 15.98 =>1598/100
عدد1.002 => 1002/1000

پس نتیجه میگیریم که مخرج ده به توان تعداد ارقام اعشار هست و صورت خود عدد بدون ممیز.
پس ضرب عدد 0.1 در 0.1 را میتونیم به 1/10 در 1/10 نمایش دهیم ؛یعنی،0.1*0.1 =1/10*1/10
در اعداد کسری صورت در صورت و مخرج در مخرج ضرب میشود پس:
0.1*0.1=( 10*10)/(1*1)
با یکم بسط دادن به نتیجه زیر میرسیم:
0.1*0.1= ( 10*10)/(1*1) =(10*10) /( 10*0.1*10*0.1)
پس برا ضرب دو عدد a و b به ترتیب با تعداد ارقام اعشار c و d
a را در ده به توان c و b را در ده به توان d ضرب کرده و سپس درهم ضرب میکنیم
در آخر جواب را بر ده به توان d*c تقسیم کرده .
اگر d و c کوچکتر یا بزرگتر از تعداد ارقام اعشار باشند جواب در ریاضی درست در میاید
ولی در اکشن اسکریپ ممکن است جواب باز اشتباه شود پس بهتر است c و d بزرگتر یا مساوی تعداد ارقام اعشار باشد.
اگه جایی در تایپ اشتباه شده ببخشید چون فرصت اصلاح ندارم
موفق باشید...
 
آخرین ویرایش:

mahsky

Member
آقای mmz2006 من من فکر کنم استفاده از floor بهتره چون اگر حاصل ضرب عدد 0.009 بشود ولی فلش 0.0090006 را به ما نشان بدهد آن وقت اگر در 1000000 ضرب کنیم تابع floor مقدار 9 و تابع round مقدار 10 را برمیگر داند؟؟؟؟
 

mahsky

Member
سلام
[JSS]
function zarb(c:Number,a:Number,f:Number=5):Number
{
var b:Number = 0;
c=c*Math.pow(10,f)
a=a*Math.pow(10,f)
b=a*c
b=b/Math.pow(10,2*f)
return b

}
[/JSS]
از این تابع میتوانید استفاده کنید.
f ماکسیمم تعداد ارقام اعشار هست.
تذکر:
Number تا هفده رقم ظرفیت دارد پس نباید در یکی از مراحل تابع اعداد a,b,c بزرگتر از هفده رقم شوند.:-?بخاطر همین f را مساوی با عدد بزرگتری قرار ندادم.
مثال:
[JSS]
trace(zarb(8.4 , 0.001))
[/JSS]
output=>0.0084
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا