2012-04-26 15 views
4

私はデータベースを正規化するプロセスを進めており、その1つのテーブルの列をFLOATからDECIMAL(28,18)に変換しています。この変換後の列を元の列に戻すと、結果が返されない場合があります。MS SQLの浮動小数点比較の問題

これは、変換された方法とは関係がありません。例えば、DECIMAL(28,18)に変換FLOATを生成します

51.051643260000006000 

FLOAT私はFLOATを修正せず、いずれかのこれらの作業のいずれの様々な方法を試みた

51.05164326 

ある:

CAST(51.05164326 AS DECIMAL(28,18)) = 51.051643260000000000 
STR(51.05164326 , 28,18) = 51.0516432599999990 

変換の理由は、これらのフィールドの精度を向上させるためです。

誰も、これらの数値を変換し、その後の結合を確実にすることができる一貫した戦略を得ていますか?あなたのアプリケーションのために事前に

おかげ

CM

+0

浮動小数点数は正確な数値が、近似値ではありません。文字列への変換は通常、正確な数字のように見えるように丸めますが、正確な表現は実際には異なります。あなたはフロートで試してみてはいけません。 – Lucero

+0

残念ながら私はたくさんの選択肢がありません。あなたはこれをラウンドする方法をお勧めしますか? – CatchingMonkey

+0

私はこれを 'decimal'に変換してキャストし、[ROUND()']を使って14桁に丸めます(http://msdn.microsoft.com/en-us/library/ms175003.aspx )。 – Lucero

答えて

5

は、あなたが必要とするどのように多くの小数点以下を検討する必要があります。実際には、小数点以下8桁〜14桁を必要とするように見えます。

変換を行う方法の1つはcast(cast(floatColumn as decimal(28,14)) as decimal(28,18))です。

小数点と浮動小数点の列の間の結合を行うには、あなたがこのような何かを行うことができます。

ON cast(cast(floatColumn as decimal(28,14)) as decimal(28,18)) = decimalColumn 

ダブルキャストを提供同じダブルキャストはdecimalColumnを作成するために使用され、この意志decimalColumnのインデックスを利用できます。

また、あなたが範囲を使用することができます参加:

ON floatColumn > decimalColumn - @epsilon AND floatColumn < decimalColumn + @epsilon 

これはまだdecimalColumnにインデックスを利用する必要があります。

ただし、小数点で結合するのは珍しいことです。実際にが必要な場合や(範囲の比較とは対照的に)直接等価比較を行う必要がある場合を除いて、単純に変換を行い、小さな損失があることを文書化する方が良い場合があります不適切なデータタイプの初期選択による正確性の欠如。詳細については

参照:

+0

遅刻の返事をして申し訳ありませんが、テストに回帰するまでには時間がかかりました。しかし、この回答はうまくいきます!ありがとうございました! – CatchingMonkey

関連する問題