مهران رضائی
2 ماه پیش توسط مهران رضائی مطرح شد
4 پاسخ

مقایسه کننده اعداد float در mysql

با عرض سلام خدمت همه دوستان
ما توی یکی از ستون های جدول mysql ، یک ستونی به نام ورژن داریم که داخلش فایل هامون رو بصورت float ورژن بندی کردیم
مثلا
1.0001
1.0002
1.0003
حالا زمانی که میخوایم بهmysql بگیم که برو version>1.002 بردار بیار ، کل جدول ها رو میاره ، امکانش هست راهنمایی کنید که چجوری من میتونم مشکلم رو حل کنم
با تشکر


ثبت پرسش جدید
محمدجوکار
تخصص : دانشجوی برنامه‌نویسی
@mjokarr 2 ماه پیش مطرح شد
0

سلام مهران جان
خب کوئریتون مشکل داره دیگه یقینا، کوئریتو بفرست ببینم چی داری میزنی که بتونیم صحیحش رو بدیم بهت
همچنین اگه میخوای دقیق‌تر کمک کنم، یه شات از تیبلت هم بده
من الان نمیدونم چه فیلد یونیکی داری...

اگه کالمن ورژنتون یونیکه، چطوری ممکنه که شما دقیقا توی کوئری بگی فلان ورژن میخوام و به جای فایل‌های متعلق به اون ورژن، مابقیه موارد رو بیاره؟

یا کوئریو بد میزنین، یا استراکچر رو بد نوشتین، یا ریلیشن‌هارو بد دادین ک این گزینه کمتر ارتباط دارع با مشکلت...

بیشتر اطلاعات بده ک بهتر کمک کنم بهت


مهران رضائی
تخصص : برنامه نویس
@mehranrezaie2010 2 ماه پیش مطرح شد
0

با سلام مجدد
من از همه قسمت ها عکس گذاشتم ، ممنون میشم راهنماییم کنید
 تصویر
 تصویر
 تصویر
 تصویر


محمدجوکار
تخصص : دانشجوی برنامه‌نویسی
@mjokarr 2 ماه پیش مطرح شد
0

سلام خدمت شما.
در ابتدا بابت تاخیر پوزش میخوام، تازه از محل کار برگشتم.

الان که دقت کردم میبینم مشکل شما یکم ریشه‌ای‌تره. حالا این که چرا این همه اعشار زدید، کاملا بستگی به پروژتون داره و شاید نیازه، اما وقتی با تعداد بالایی اعشار قراره همچین چیزی رو مقایسه کنید، گاهی sql دچار خطا میشه که دلیلش یکم خارج از بحث ماست.
درکل باید بدونید که float ها با دقت‌ بسیار بالایی محاسبه نمیشن و توی اعداد خیلی کوچیک دچار خطا میشن گاهی. درحقیقت مشکل در محاسبه نیست، مشکل در ذخیره‌سازیه اولیه‌ست. یعنی ممکنه به شکل زیر ذخیره بشن

float 1.0002 // 1.0002
float 1.0001 // 1.00010000001 

در این صورت، باز هم عدد ۱.۰۰۰۱۰۰۰۰۰۰۱، بیشتر از ۱.۰۰۰۱ به حساب میاد. برای همینه که توی کوئری برش میگردونه برات. اینم مثالش بود که درک کنی موضوعو...
راه حلی که به فکر من میرسه، سینتکسیه که توسط cast و decimal بیای بگی مثلا اعدادی که بهت میدم رو تا ۵ رقمه اعشار محاسبشون کن فقط. اینطوری دیگه اگر موقع ذخیره سازی با خطای جزئی هم داده‌های float ذخیره شده باشن، توی محاسبه دقیق برمیگردن. این کد رو امتحان کن اگر مشکلی داشتی بگو باز:

SELECT * FROM `table` WHERE CAST(version AS DECIMAL(10, 5)) > 1.0001

ایامت به کام


مهران رضائی
تخصص : برنامه نویس
@mehranrezaie2010 2 ماه پیش مطرح شد
1

سپاس بی کران


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام