2012-01-12 13 views
8

Ben mysql tabloda bu var:Neden bu sql sorgusu, kayan nokta sayılarını karşılaştırarak herhangi bir sonuç getirmiyor?

enter image description here

id ve bolag_idint bulunmaktadır. lat ve lngitude, double'dur. Ben lngitude sütun kullanırsanız

, hiçbir sonuç döndürülür:

lngitude Sorgu: = 13.8461208

AncakSELECT * FROM location_forslag WHERE lngitude, ben lat sütun kullanırsanız, bu dönüş sonuçlarını yapar:

lat Sorgu:SELECT * FROM location_forslag WHERE lat = 58.3902782

lngitude sütununda sorun nedir?

+0

13.8461208 VE 13.8461209 ARASINDA NEREDEYI GEREKİR. – Benoit

+0

@Benoit, 13.8461207 VE 13.8461208 –

cevap

9

. Başvurunuzun için

  • Dealing with accuracy problems in floating-point numbers

    Is it correct to compare two rounded floating point numbers using the == operator?

    • , size cevap vermesini istiyorsun ne kadar yakın dikkate almak gerekir.

      1 derece yaklaşık 112km ve 0.00001 derece yaklaşık 1.1 metredir (ekvatorda). İki noktanın 0,00000001 derece = 1 mm farklı olması durumunda uygulamanızın "eşit değil" demesini gerçekten istiyor musunuz? lngitude arzu edilen değerin @epsilon derece arasında olduğu

      set @EPSLION = 0.00001 /* 1.1 metres at equator */ 
      
      SELECT * FROM location_forslag 
      WHERE `lngitude` >= 13.8461208 [email protected] 
      AND `lngitude` <= 13.8461208 + @EPSILON 
      

      Bu

      sayı döndürür. Uygulamanız için uygun olan epsilon için bir değer seçmelisiniz.

    +2

    Bu durumda kötü değil (daha okunaklı IMO). – Benoit

    +1

    Nasıl 'lngitude' LIKE 13.8461208 kullanıyoruz? Bu bir çözüm olabilir mi? –

    +0

    @Lille_skutt: Hayır, doğruluğun ne olduğu konusunda bilinçli bir karar almalı ve karşılaştırmalarınızı açıkça yapmalısınız. Veritabanında size yardımcı olacak hiçbir şey yok - bazı GIS uzantılarınız yüklenmedikçe. – Ben

    4

    Floating points are irritating .... Genellikle = ile kayan nokta sayıları operatörü eşittir karşılaştırmak için iyi bir fikir değildir

    WHERE ABS(lngitude - 13.8461208) < 0.00000005 
    
    +0

    olarak değiştirirse çalışır. Yani diğer sütun ile çalıştığı sadece tesadüf mü? Bunu daha iyi bir veri türünde saklayabilir miyim? –

    +0

    A 'DECIMAL 'veri türü, son MySQL sürümlerinde tamdır, bağlantıya bakın. – Wrikken

    +0

    Veri türü gayet iyi, sorun "eşit" anlamının uygulamaya bağlı olmasıdır - gerçek dünyada böyle bir şey yoktur.Bir satnav uygulamasında, eşit "10 metre içinde" olabilir. Bir arazi kayıt veritabanı için "0.05 metre içinde" yeterince iyi olabilir. Bir mutfak yapmak, "5 mm içinde" olabilir. – Ben

    0

    Karşılaştırma yapmak için yüzdeyi floroya dönüştürün. Ben aynı problem vardı ve bunun gibi çözülür:

    SELECT 
        [dbo].[Story].[Longitude], 
        [dbo].[Story].[Latitude], 
        [dbo].[Story].[Location], 
    FROM 
        [dbo].[Story], 
        [dbo].[Places] 
    WHERE 
        convert(decimal, [dbo].[Story].[Latitude]) = convert(decimal, [dbo].[Places].[Latitude]) 
        and 
        convert(decimal, [dbo].[Story].[Longitude]) = convert(decimal, [dbo].[Places].[Longitude]) 
        and 
        [dbo].[Places].[Id] = @PlacesID 
        and 
        [dbo].[Story].IsDraft = 0 
    ORDER BY 
        [dbo].[Story].[Time] desc 
    

    bak ilk 3 satır en NEREDE clausule sonra. Umut eder.

    İlgili konular