PDA

View Full Version : مشکل با نوع داده ای Float



veniz2008
پنج شنبه 20 مهر 1391, 10:18 صبح
سلام . یه سوال درباره نوع داده ای float دارم. من فیلدی در جدول دارم که از نوع float هستش ولی هنگام ذخیره کردن مثلا مقدار 39.67 رو بصورت 39.669998168945312 ذخیره میکنه. من درون سی شارپ با کد زیر اونو گرد میکنم(با مسیج باکس تست کردم و مطمئنم که درسته) ولی موقع ذخیره شدن دوباره بصورت 39.669998168945312 ذخیره میشه. آیا سمت sql هم باید کار خاصی انجام بدم؟
کد گرد کردن :

(float)Math.Round(float.Parse(TxtDarsPercent.Text) ,2)
اینم کدی که باهاش پارامتر رو میفرستم :

cmd.Parameters.AddWithValue("@darspercent", (float)Math.Round(float.Parse(TxtDarsPercent.Text) ,2));

حمیدرضاصادقیان
پنج شنبه 20 مهر 1391, 16:53 عصر
سلام.
نوع فیلد رو از نوع Decimal(28,2) در نظر بگیرید.در این حالت شما تعداد اعشار فیلد مورد نظر رو زیاد در نظر گرفتید.

veniz2008
پنج شنبه 20 مهر 1391, 18:05 عصر
ضمن تشکر از پاسخ شما. چندتا ابهام واسم پیش اومده که ممنون میشم راهنمایی بفرمایید. من این فیلد رو برای ذخیره کردن درصد هر یک از دروس میخوام که حداکثر 100 و حداقل 33.33- هستش. آیا با این توضیحی که دادم نوع داده ای decimal صحیح هستش؟. چون معمولا اساتید میگن که نوع داده ها رو با توجه به نیازهاتون انتخاب کنید. مثلا اگر نوع int کفایت میکنه نیازی به استفاده از big int نیست.
یکی از دوستان اینطوری راهنمایی کردن :
نوع داده ای همچنان float باشه، فقط کدنویسی بصورت زیر میشه:

cmd.Parameters.AddWithValue("@darspercent", Convert.ToDouble(TxtDarsPercent.Text));
کدشون رو تست کردم و جواب داد. آیا این روش میتونه خطراتی رو داشته باشه؟

حمیدرضاصادقیان
پنج شنبه 20 مهر 1391, 20:12 عصر
بله.چون میخواهید به صورت اعشار ذخیره کنید از همین نوعی که عرض کردم استفاده کنید.
که در این نوع در داخل پرانتز دورقم اول مشخص کننده طول کل عدد هست و دورقم دوم بعد مشخص کننده تعداد ارقام اعشاری می باشد

veniz2008
پنج شنبه 20 مهر 1391, 20:20 عصر
ببخشید جناب صادقیان من قانع نشدم. چرا نوع float مناسب نیست؟. مگر برای داده های کوچک اعشار از float استفاده نمیکنند؟.
اون روشی که دوستمون گفتن چه مشکلی ایجاد میکنه؟(ظاهرش که درسته و داده رو هم درست ذخیره میکنه).
ممنون میشم دلیل بیارید. تشکر.

حمیدرضاصادقیان
پنج شنبه 20 مهر 1391, 22:38 عصر
نوع داده ای Float و Real زمانی استفاده می شود که بخواهید به صورت تقریبی عددی رو ذخیره کنید و دقت عدد برای شما زیاد اهمیتی نداره. ولی اگر دقت اعداد براتون مهمه باید از نوع های Decimal,Integer استفاده کنید.دومین مورد این هست که قسمت اعشاری float به صورت ثابت می باشد ولی در Decimal میتوانید بسته به نوع کاری که میکنید مقدار قسمت اعشاری رو تغییر بدید.

veniz2008
پنج شنبه 20 مهر 1391, 22:54 عصر
از توضیحاتتون ممنونم،بخشی از جواب هامو گرفتم. ولی آخرش نگفتید اون convertToDouble که دوستمون گفته بودن چه مشکلی ایجاد میکنه.
یه سوال دیگه : نوع داده ای double در سی شارپ، معادل کدوم نوع در sql میشه؟

حمیدرضاصادقیان
پنج شنبه 20 مهر 1391, 23:43 عصر
درمورد سوال اولتون فقط محتوای یک text رو به نوع Double تغییر میده ومشکلی ایجاد نمیکنه و اگر نباشه فکر نمیکنم بتونید مقدار text رو ارسال کنید!
درمورد سوال دوم فکر lمی کنم بهترین نوع همون Decimal باشه.