PDA

View Full Version : سوال: محاسبات ریاضی اشتباه در سی شارپ



ashkan1234
جمعه 08 شهریور 1392, 21:59 عصر
سلام!
نمیدونم اسمشو بزارم ایراد یا باگ یا(ایراد از خودمه؟باگ از خودمه؟:لبخند::متفکر::کف:)
اگر دو تا عدد رو در سی شارپ بر هم تقسیم کنید و عدد اول کوچکتر از دومی باشد.
با کمال شگفتی میبینید خروجی صفر است!
بصورت خودکار دوتا عدد رو از نوع int میگیره که هیچ برام جای سواله چرا نتیجه رو هم int میگیره؟
امتحان کنید:
MessageBox.Show((2/8).ToString());
جواب صفر
بطور پیش فرض int در int حاصل int
حالا اینو ببینید:
double i = 2;
MessageBox.Show((i/8).ToString());
حالا درست میشه!
باز اگر مقدار اول رو short در نظر بگیرید پاسخ صفر هست!
2 یا 3 ساعتی سرکار بودم که چرا مقادیر رو بعضی جاها اشتب میده!
به نظر من اینجوری خیلی بده آخه من کلی محاسبات رو از تو بانک اطلاعاتی با مقادیر short و int بر میگردونم که حاصلشون نباید 0 بشه!
پروژه ام بزرگه!
دهنم آسفالتیته میشه اگر بخوام همه رو convert.todouble بزنم!
بنظرتون چیکار کنم!؟؟؟
خیلی برام عجیب بود!
قدیما که با vb6 کد میزدم اون شعورش بیشتر از سی شارپ میرسید!:لبخند::گیج:
شاید من فقط تا حالا نمیدونستم!
اگر چیزای مشابه این هست بفرمایید تا مطلع شویم

aliagamon
جمعه 08 شهریور 1392, 22:03 عصر
از این استفاده کنین:

MessageBox.Show((2.0 / 8.0).ToString());

یا از این:

short i = 2;
MessageBox.Show(((double) i / 8).ToString());

ashkan1234
جمعه 08 شهریور 1392, 22:08 عصر
از این استفاده کنین:

MessageBox.Show((2.0 / 8.0).ToString());

یا از این:

short i = 2;
MessageBox.Show(((double) i / 8).ToString());


عزیز دل برادر...
من مسیج باکس رو بعنوان مثال گفتم.
عرض کردم مقادیرم از بانک اطلاعاتی برمیگرده!
بخوام واسه یکی یکیش اینکارارو کنم که بدبختم...:گیج:

wolf_majid
جمعه 08 شهریور 1392, 23:25 عصر
منظورتون از یکی یکی مشخص نیست
با یک حلقه به سادگی میشه مقادیر رو عوض کرد
در غیر اینصورت :
List<Student> students = new List<Student>
{
new Student("m17", 1)
,
new Student("m2", 2)
,
new Student("m3", 3)
,
new Student("m4", 4)
,
new Student("m5", 5)
,
new Student("m6", 6)
,
new Student("m7", 7)
,
new Student("m8", 8)
,
new Student("m9", 9)
,
new Student("m10", 10)
,
new Student("m11", 11)
};

MessageBox.Show((students[0].grade/students[1].grade).ToString()); //0

var v = (from s in students
select new {Name=s.name,Grade= (double) s.grade}).ToList();

MessageBox.Show((v[0].Grade/v[1].Grade).ToString());//0.5

ashkan1234
سه شنبه 12 شهریور 1392, 16:46 عصر
منظورتون از یکی یکی مشخص نیست
با یک حلقه به سادگی میشه مقادیر رو عوض کرد
در غیر اینصورت :
List<Student> students = new List<Student>
{
new Student("m17", 1)
,
new Student("m2", 2)
,
new Student("m3", 3)
,
new Student("m4", 4)
,
new Student("m5", 5)
,
new Student("m6", 6)
,
new Student("m7", 7)
,
new Student("m8", 8)
,
new Student("m9", 9)
,
new Student("m10", 10)
,
new Student("m11", 11)
};

MessageBox.Show((students[0].grade/students[1].grade).ToString()); //0

var v = (from s in students
select new {Name=s.name,Grade= (double) s.grade}).ToList();

MessageBox.Show((v[0].Grade/v[1].Grade).ToString());//0.5

سلام!
کدهای محاسبات رو نوشتم تموم شده! همه رو از حفظ نیستم که بدونم نوع مقادیرشونو تو بانک چی گذاشتم!که حالا برم اونا رو بزارم تو حلقه!
ولی فکر نکنم چاره غیر اینا باشه!چون در هر صورت int/int=int میشه و طبق تحقیقاتی که کردم انگار تو اکثر زبانها هم همینجوریه!
فقط متعجبم از vb6!شایدم من اشتب میکنم!:گیج:
منظورم از یکی یکی اینه!

aliagamon
سه شنبه 12 شهریور 1392, 17:29 عصر
نه وی بی خودش میتونه فرمت هارو اوتوماتیک کانورت کنه طبق نیاز(اینجا میکنه double)