4

私はデータベースを正規化する過程にあり、その一部には、列を1つのテーブルからaに変換することが含まれFLOATますDECIMAL(28,18)。次に、この変換された列をソース列に結合しようとすると、結果が返されない場合があります。

それは、その回心の仕方と関係があるようです。たとえば、に FLOAT変換されたものDECIMAL(28,18)は次のようになります。

51.051643260000006000

オリジナルFLOAT

51.05164326

私はを変更するさまざまな方法を試しましたがFLOAT、これらのいずれも機能しません。

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

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

これらの数値を変換し、後続の結合が確実に機能するようにするための一貫した戦略を持っている人はいますか?

前もって感謝します

CM

4

1 に答える 1

6

アプリケーションでは、必要な小数点以下の桁数を考慮する必要があります。実際には、18ではなく小数点以下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

ただし、小数で結合することはまれです。実際にそれらに参加する必要がある場合、または(範囲比較ではなく)直接等式比較を行う必要がある場合を除いて、そのまま変換を行い、精度がわずかに低下するという事実を文書化する方がよい場合があります。不適切なデータ型を最初に選択したため。

詳細については、以下を参照してください。

于 2012-04-26T09:15:47.667 に答える