PDA

View Full Version : اعداد بزرگ و پريدن رقم يكان در float



A.Farzin
سه شنبه 02 اسفند 1390, 14:36 عصر
با سلام

لطفاً اسكريپت زير را اجرا كنيد

Create table #t1(f1 float)

insert into #t1(f1) Values(83188846031888476)
insert into #t1(f1) Values(83188846031888477)
insert into #t1(f1) Values(83188846031888478)
insert into #t1(f1) Values(83188846031888479)
insert into #t1(f1) Values(83188846031888480)

select f1, Cast(f1 as decimal(28,0)) as f2, convert(decimal(28,0), f1) as f3
from #t1
Where f1 = 83188846031888476
در كوئري آخر، ما فقط اطلاعات مربوط به اولين Insert را خواسته‌ايم ولي هر 5 ركورد بر مي‌گردد.
انگار عدد يكان در همه اين ركوردها حدف و عدد دهگان روند شده است.
اين مشكل از كجاست؟ و غير از تغيير Data Type به Char , ... چه راه حلي دارد؟
متشكرم

nedata
سه شنبه 02 اسفند 1390, 15:16 عصر
Create table #t1(f1 decimal)

insert into #t1(f1) Values(83188846031888476)
insert into #t1(f1) Values(83188846031888477)
insert into #t1(f1) Values(83188846031888478)
insert into #t1(f1) Values(83188846031888479)
insert into #t1(f1) Values(83188846031888480)

select f1, Cast(f1 as decimal(28,0)) as f2, convert(decimal(28,0), f1) as f3
from #t1
Where f1 = 83188846031888476

hf1988
سه شنبه 02 اسفند 1390, 16:15 عصر
سلام دوست عزیز .مشکل شما مربوط به data type ای هستش که دارید استفاده میکنید. یعنی شما از float استفاده کردین که 4 bye از حافظرو به صورت ممیز شناور اشغال میکنه و به عبارتی تنها 7 رقم معنا دار رو تو خودش جا میده . اگه بخوایم درمورد کارایی float بگیم اینه که داده های بزرگی رو میشه باهاش ذخیره کرد.اما نه به صورت دقیق. اما یه نوع دیگه ای که به صورت دقیق داده مارو نگه داری میکنه نوع decimal هست که 16 بایت از حافظرو اشغال میکنه اما تضمین میکنه که داده ما تا 28 -29 رقم معنا دار رو بتونه ذخیره کنه.بنابراین در اکثر محاسبات دقیق مالی از این نوع داده استفاده میشه .اما یادمون باشه که 4 برابر بیشتر از float در حافظه جا میگیره.