11

SQL ServerでFloatをDecimal(28,10)に変換する必要があります。私の問題は、floatの性質と変換の方法により、floatをキャストするだけで、ユーザーには間違った数値に見える可能性があることです。

例えば:

Float:               280712929.22 
Cast as Decimal:     280712929.2200000300
What I think I want: 280712929.2200000000

floatの動作(おおよそのデータ型など)については少し理解していますが、最後に300が追加される理由を理解するには確かに十分ではありません。変換の副作用としての単なるゴミですか、それともフロートが実際に保存しているものをより正確に表現したものですか?私には、それは薄い空気から正確に引き出されたように見えます。

最終的には、正確であるだけでなく、「正しく」見える必要があります。末尾のゼロを追加したように見えるので、その一番下の数値を取得する必要があると思います。これは可能ですか?これは良い考えですか、それとも悪い考えですか、そしてその理由は何ですか?他の提案も歓迎します。

他のいくつかの例:

Float:           364322379.5731
Cast as Decimal: 364322379.5730999700
What I want:     364322379.5731000000

Float:           10482308902
Cast as Decimal: 10482308901.9999640000
What I want:     10482308902.0000000000

補足:これらの値を入力する新しいデータベーステーブルは、ユーザーが読み取ることができます。現在は小数点以下2桁しか必要ありませんが、将来変更される可能性があるため、Decimal(28,10)を使用することにしました。長期的な目標は、データを取得しているfloat列も10進数に変換することです。

編集:時々、私が持っている浮動小数点数は、私がこれまでに必要とするよりも多くの小数点以下の桁数を持っています、例えば:-0.628475064730907。この状況では、-0.6284750647へのキャストで問題ありません。基本的に、小数点以下10桁になるまで、フロートの最後にゼロを追加する結果が必要です。

4

3 に答える 3

9

丸めるために1回キャストする必要があり、小数点以下の桁数を追加するために1回キャストする必要があります(他の方法もあります。確かにSTRROUNDなどを使用します)。

DECLARE @c TABLE(x FLOAT);

INSERT @c SELECT 280712929.22;
INSERT @c SELECT 364322379.5731;
INSERT @c SELECT 10482308902;

SELECT x, 
    d = CONVERT(DECIMAL(28,10), x), 
    rd = CONVERT(DECIMAL(28,10), CONVERT(DECIMAL(28,4), x))
FROM @c;

結果:

x               d                       rd
--------------  ----------------------  ----------------------
280712929.22    280712929.2200000300    280712929.2200000000
364322379.5731  364322379.5730999700    364322379.5731000000
10482308902     10482308902.0000000000  10482308902.0000000000

正確で見栄えを良くしたい場合FLOATは、おおよそのデータ型であり、厳密な数学のバックグラウンド以外のほとんどの人にとって論理に反する、の使用をやめてください。必要以上に大きなスケールで使用DECIMALし、現在必要な小数点以下の桁数にフォーマットします(クエリで、ビューを作成するか、計算列を作成します)。現在必要以上の情報を保存している場合は、いつでも後で公開できます。また、ユーザーにテーブルへの直接アクセスを許可しないように選択することもできます。

于 2012-06-20T12:17:11.970 に答える