2012-02-24 13 views
0

浮動小数点データ型に奇妙な問題があります。 以下のスクリーンショットをご覧ください。sql浮動小数点数の桁区切りと境界条件が失敗する

enter image description here

クエリ1レコードを与えます。クエリー2はレコードを与えないので。 netbk_amtはテーブル内でfloat型です。 また、最初のクエリを>= (convert(float, 100001))に変更すると、レコードが取得されません。値がこのクエリで何が悪かったのかを見つけるために私を助けてください> 1000000しかし< 1000001.である。しかし、テーブルにそれは1000000

として示されているよう

が見えます。

クエリ:

select co_id, SUM(netbk_amt) from its_deal_sum where co_id = 19237 
group by co_id 
having convert(float,SUM(netbk_amt)) >= convert(float,1000000) 

select co_id, SUM(netbk_amt) from its_deal_sum where co_id = 19237 
group by co_id 
having convert(float,SUM(netbk_amt)) <= convert(float,1000000) 

コメントで示唆したように私は一種の、一時的な修正など

select co_id, SUM(netbk_amt) from its_deal_sum where co_id = 19237 group by co_id having convert(money,SUM(netbk_amt)) = convert(money,1000000) 

をこれをしました。しかし、フロートを使って堅牢な修正を探し、分数を無視してください。

+3

なぜあなたはドルの金額のFLOATを使用していますか?私はあなたがデータ型を再考することをお勧めします。 –

+0

Raghavは、 "最初のクエリを> =(convert(float、100001))に変更すると"と書いています。その数は10^5 + 1です。あなたが望むものは10^6 + 1でした。 –

+1

浮動小数点の値が2つの浮動小数点の差として計算され、その2つの浮動小数点のいずれかを浮動小数点として正確に表すことができない場合、その差はわずかではありません。たとえば、1000001.01 - 0.01 = 1000000.0000000000001です。 (私はエラーの正確な量はわかりませんが、起こる可能性があります)アーロン氏は言ったように、あなたのデータタイプを再考します。フロートはお金には不適切です。 –

答えて

1

は画分

を無視した場合は、何をしたいすべてのである - それは非常に簡単です。

DECLARE @f float=2.000000000001 
SELECT @f,FLOOR(@f) 

結果セット:

(No column name) (No column name) 
2.000000000001  2 
関連する問題