none
sql sorgu yazarken virgüllü sayıların toplamında hata veriyor (Sebebini bilen varmı?) RRS feed

  • Genel Tartışma

  • sql sorguda select sum(ad) from tabloadi vs gibi bir sorgu yazdığım zaman eğer topladığı sayılar içerisinde virgülden sonraki kısmı 6,7 gibi olan sayıların toplamını **,300000000247468 gibi absürt bi şekilde veriyor. Sayı tipleriyle oynasamda yine sorunu çözemedim. Yuvarlama işlemi yapıpda sorunu görmezden gelmek istemiyorum. Acaba problemin kaynağını bilen varmı. Cevaplarınız için şimdiden teşekkürler.
    23 Temmuz 2016 Cumartesi 00:28

Tüm Yanıtlar

  • toplamak istediğin alanların Float mı ?
    • Düzenleyen A_BLR 23 Temmuz 2016 Cumartesi 06:57
    23 Temmuz 2016 Cumartesi 06:57
  • hayır double

    23 Temmuz 2016 Cumartesi 18:44
  • MS SQL Server'da double diye bir data tipi olmadigina gore, float ya da real demek istedin sanirim. Decimal, numeric ya da money kullanirsaniz sorun kalmaz. 

    23 Temmuz 2016 Cumartesi 21:48
  • hocam cevap için teşekkürler fakat problem çözülmedi decimal numeric veya money yaptığım zaman sayıyı en yakın tam sayıya yuvarlıyor. Benim istediğim bu değil. Örneğin 2,6+3,7=6,3 olması gerekirken sonucu 6,300000000004562313 şeklinde döndürüyor.
    24 Temmuz 2016 Pazar 16:51
  • Merhabalar,

    decimal(p,s) şeklinde tanımlama veya dönüşüm gerçekleştirmeyi dener misiniz? p kısmı precision olup sayının toplam kaç basamaklı tutulabileceğini belirtirken, s kısmı scale yani virgülden sonraki ondalıklı kısmın kaç haneli duyarlıklı olacağını belirler. Sizin örneğinizde eğer ondalıklı kısmın duyarlılığı 1 hane olacaksa decimal(18,1) gibi bir tanımlama kullanabilirsiniz. Duyarlılık artsın istiyorsanız s kısmını değiştirerek istenilen duyarlıkta sayıları tutabilirsiniz.

    Umarım faydalı olur...


    Please Mark This As Answer if it solved your issue
    Please Vote This As Helpful if it helps to solve your issue
    www.abdullahaltintas.com

    24 Temmuz 2016 Pazar 17:14
  • Merhaba

    Öncelikle float alanlar aslında sayıları sizin yaptığınız gibi 3.7 olarak tutmazlar bunun sebebini net olarak söylemem mümkün değil sayının boş alanına çeşitli ondalıklar atarlar. Her ne ise eğer sum(ad) şeklinde bir şey yapacaksanız öncelikle sum(convert(money, ad)) işlemini yapmalısınız. yada convert işlemini decimal(10,2) gibi bir şekilde öncelikle convert etmeniz mantıklı olacaktır. Convert işlemi işe yaramadığını düşünürseniz matematiksel virgül sonrasını yuvarlama olan floor, ceiling vs işlemlerinden faydalanabilirsiniz. https://msdn.microsoft.com/en-us/library/ms177516.aspx bu linkten matematiksel işlemleri bulmanız mümkün.

    24 Temmuz 2016 Pazar 19:57
  • 2,6+3,7=6,3 sonucunu zaten 6,3 olarak donduruyor (sonrasindaki 00045... yok). Decimal, numeric veya money ile en uakin tam sayiya yuvarlama soz konusu degil.
    24 Temmuz 2016 Pazar 23:31
  • Merhaba

    Öncelikle float alanlar aslında sayıları sizin yaptığınız gibi 3.7 olarak tutmazlar bunun sebebini net olarak söylemem mümkün değil sayının boş alanına çeşitli ondalıklar atarlar. 

    Kafasına göre ondalık atmıyor tabiki :). double, float, single... Bunların adları neden böyle diye düşünmek gerekli. Hepsi floating point kavramı ile alakalı olarak böyle oluyor.

    İşin geyik kısmı, buradan sonrasını atlayabilirsin :

    Floating point sayılarda 0 dan uzaklaştıkça hassasiyet azalır. Yani 0 a görece yakın bir yerde iki sayı arasındaki fark 0.00001 iken 0 dan uzaklaştıkça 0.01 olacaktır. Bu sebeble her sayıyı olduğu gibi saklamak mümkün olmayacaktır. Yine bu sayılar, bir tam sayı ve  kuvvet değerini ve ondalığın nereden başlayacağını tutarlar (negatif üsler ondalıklı sonuç verir). Yani sayının kendisinden çok o sayıyı elde edecek matematiksel işlemi barındırırlar.  

    Kayar nokta matematiğini burada anlatmak abes olacağından merak edenler araştırsın. O zaman mantissa , exponent vs. nedir diye yuttuğunuzda o yukarıdaki gibi sayılar absürt olmak yerine bilimsel olacaktır.

    25 Temmuz 2016 Pazartesi 06:07
  • Hocam floating point konusunu kısa da olsa araştırınca sebebini anladım. Cevabınız için teşekkürler. Benim için faydalı oldu.
    26 Temmuz 2016 Salı 12:43
  • exponent: okuldayken "gerçek hayatta bunlar ne işimize yarayacak amk" dediğimiz bişey işte :)

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    26 Temmuz 2016 Salı 12:51