3

私はこの声明を持っています:

Select STORE_NAME,STORE_LATITUDE,STORE_LONGTITUDE
 from stores 
  where STORE_LATITUDE=24.6669863852163
         and STORE_LONGTITUDE=46.69189453125

このステートメントは1行を返す必要があり、データベーステーブルにあるように正しい緯度と経度を入力したと確信していますが、探しているストアではなくnull値を返しますが、間違ったSTORE_LATITUDEを見つけることができません。 STORE_LONGITUDE は float として宣言されています

4

4 に答える 4

1

浮動小数点値は本質的に近似値です。それらを同等に比較するのは本当に難しいです。「手榴弾と馬蹄形の近接カウント」に関する古い格言は、浮動小数点計算にも適用されます。

私が言おうとしているのは、浮動小数点数が等しいかどうかを確実にテストすることは決してできないということです。

次のようなクエリが必要です。

 Select STORE_NAME,STORE_LATITUDE,STORE_LONGTITUDE
   from stores 
  where STORE_LATITUDE BETWEEN 24.6669863852163 - 0.0001
                           AND 24.6669863852163 + 0.0001
    AND STORE_LONGTITUDE BETWEEN 46.69189453125 - 0.0001
                             AND 46.69189453125 + 0.0001

ちなみに、緯度0.0001度は地上で約11メートルに相当します。地球の形に関する球状の仮定が崩壊し始める場所であるため、店舗の場所がそれほど正確である可能性はほとんどありません。

24.6669863852163 のような緯度基準の精度は、約 11 ナノメートル、つまり複雑な炭水化物の分子などのサイズです。これは分子生物学にとっては素晴らしいことですが、ストア ファインダーにとっては明らかにやり過ぎです。

于 2013-08-07T20:10:13.210 に答える
0

浮動小数点は精度を正しく保持しません。正確な精度が必要な場合は、10 進数データ Type を使用する必要があります。上記の場合、値を Decimal(38,20) として再定義して、経度と緯度の値を格納できます。

SQL Server 2008 以降のバージョンを使用している場合、SQL Server は SPATIAL データ型をサポートします。これには、経度と緯度を保持する機能があり、それらに基づいて多くの計算も行います。

ここから空間データ型の詳細を見つけることができますhttp://msdn.microsoft.com/en-us/library/bb933790.aspx

于 2013-07-03T08:23:37.820 に答える
0

cast() または convert()を使用してみてください

Select STORE_NAME,STORE_LATITUDE,STORE_LONGTITUDE
from stores 
where Convert(decimal(9,2),STORE_LATITUDE)=24.66
and Convert(decimal(9,2),STORE_LONGTITUDE)=46.69
于 2013-07-03T08:29:33.250 に答える