2009-08-14 19 views
1

良い日々。私のテスト環境と私の生産環境との間には奇妙な違いがあります。私はフロートとしてデータを格納するテーブルを持っています。私は次のスクリプトを両方とも異なる結果で実行し​​ます:浮動小数点の格納方法を指定するSQLの設定

insert into myTable(myFloat) 
    select top 1 26.1295 as foo 

Select myFloat from myTable 
Server A = 26.1295 
Server B = 26.129499435424805 

これを引き起こすサーバーの設定に違いはありますか?どんな考えも大いに役立ちます。

おかげ

+0

私はそれがSQLクエリアナライザまたは使用しているツールの設定である必要がありますね。 – shahkalpesh

+1

結果を取得して表示するのにどのツールを使用していますか? –

+0

どちらのシステムも、SQL 2000 Enterprise Managerに同梱されているMS Query Analyzerを使用しています。 – souLTower

答えて

0

フロートは、これが起こる理由である、IEEE 754 standardに応じて格納されています。

小数点以下の精度が必要な場合は、decimalデータ型(またはnumeric、同じもの)を使用します。しかし、コンピュータは浮動小数点演算をネイティブに行うことができるため、浮動小数点よりも少し遅いことに注意してください。ただし、余分なオーバーヘッドが10進数/数値計算に入ります。

+0

異なるマシン上にあるという違いはありますか?私はこの使用のための浮動小数点数が "悪い"ことを知っています。私はシステムを継承し、現時点でそれを変更することはできません。 – souLTower

+0

@soultower:両方のテーブルのデータ型が「浮動」ですか?または、データ型 'decimal' /' numeric'のいずれかですか? – Eric

+0

どちらも同じスクリプトから作成されたfloatです。 – souLTower

0

実際のデータタイプとは何ですか。どのように値を表示していますか?実際には、異なる方法で表示される同じ値になる場合があります。

.NETフレームワークのdoubleデータタイプに対応するMSSQLデータタイプfloatを意味する場合、精度は約15桁です。

.NETフレームワークのfloatデータタイプに対応するMSSQLデータタイプrealを意味する場合、精度は約7桁です。

どちらのデータ型も精度が限られているため、割り当てられた正確な値を返すことは期待できません。格納された値は、データ型が表すことができる最も近い値です。したがって、精度が終了する場所で丸められることがよくあります。値26.1295を単精度フィールドに格納すると、26.129499435424805という値になる可能性があります。これは、フィールドの精度で得られる値に近い値になります。

値をどのように表示するかは、表示方法によって異なります。通常、値をテキスト表現に戻すコードでは、精度が終了する前に停止するように四捨五入されているため、その差異は決して見えません。

値を単精度数値としてデータベースに格納しますが、データベースから読み取るときに倍精度数値に変換すると、その値が格納されたままになります。精度。拡大変換は精度を向上させますが、それ以上の情報は追加できません。

+1

両方のシステムは、float長さ8の精度53として格納します。「現実の」シナリオは、給与に対する便益を計算するビューです。利益は26.1295%でした。 2つのシステムの違いは、同じアプリケーションコードを1つのインスタンスで切り上げて他のインスタンスで切り捨てる完全なしきい値で十分でした。ペニーの真の違いは、1ドル(表示)のアプリケーションの違いが発生します。物事の巨大なスキームでは、表示値ではなく、格納されている真の値なので、アプリ全体の効果は小さいです。 – souLTower

+0

floatとして格納する場合、真の値は格納されません。あなたがそれを計算しているなら、あなたは間違った計算をする可能性が最も高いです。 – HLGEM

+0

@souLTower:金銭的価値を扱う場合は、浮動小数点型を記憶域に使うのではなく、Decimalデータ型を使うべきです。 – Guffa

0

計算を行うためにfloatを使用することは絶対に避けてください。これは正確なデータ型ではなく、計算にエラーが発生します。数値または小数のデータ型を使用するように構造体を変更する必要があります(値の除算と乗算を行うためにいくつかの余裕を持たせることを忘れないでください)。

+0

速度を求め、正確な結果を期待しない限り、浮動小数点値は計算を行う値には優れています。 – Guffa

+0

正確な結果が得られない計算は、元監査人には役に立たないと言います。近似が必要な科学的アプリケーションがあるかもしれませんが、私はビジネスアプリケーションがないことを知っています。そして、それらの近似がいかに速く重大な財政的誤差につながる可能性があるかは、あなたは驚くでしょう。 – HLGEM

関連する問題