2012-06-20 38 views
6

SQL Serverで浮動小数点数を小数点(28,10)に変換する必要があります。私の問題は、浮動小数点の性質と変換が行われる方法のために、単に浮動小数点をキャストすると、ユーザーに間違った番号が表示されることがあります。例えば浮動小数点数を10進数に変換

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

私は道フロート作品(それはおおよそのデータ・タイプなどだということ)について少し理解して、それが最後に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)に変更する可能性があります。長期目標は、データを取得しているフロートの列を10進数に変換することです。

編集:時々、私が持っている浮動小数点数は、必要以上に小数点以下を持つことがあります。例:-0.628475064730907。この場合、-0.6284750647へのキャストは問題ありません。私は小数点以下10桁まで浮動小数点の最後にゼロを追加するために基本的に結果が必要です。

+0

は、たぶん私は答えを見つけました。 http://stackoverflow.com/questions/34316871/how-can-the-following-result-of-casting-from-float-to-numeric-be-explained –

答えて

8

あなたは(他の方法等、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を必要以上に大規模に使用し、クエリに必要な小数点以下の桁数にフォーマットします(ビューを作成するか、計算カラムを作成します)。必要な情報よりも多くの情報を保存すると、後でいつでも情報を公開できます。また、ユーザーがテーブルに直接アクセスできないようにすることもできます。

+0

10進数の数字は、少なくともそれが異なる場合があります私の考え。 –

+0

それは学位に役立ちます。しかし、それは私が最初に実際に小数点以下4桁を持つ浮動小数点数、すなわち517822.18109027を切り捨てることを意味します。ポストを編集して明確にします。 –

+2

条件付きで、その行の値に基づいてすべての行に表示する小数点以下の桁数を決定する必要がある場合は、文字列の解析/書式設定の領域に渡っていると思います。これはおそらく、データベースではなく、プレゼンテーション層で最も効果的です。 –

1

私はこれが昆虫移植に該当するかどうかはわかりませんが、私は最近同様の問題がありましたので、投稿するかもしれないと思っていました。

これは罪としては醜いかもしれませんが、上記のAaronの回答から修正されたようです。

DECLARE @myTable TABLE(x FLOAT); 

INSERT INTO @myTable VALUES 
    (280712929.22), 
    (364322379.5731), 
    (10482308902), 
    (-0.628475064730907); 

SELECT x, 
     d = CONVERT(DECIMAL(28,10), x),     
     NewDec = CONVERT(DECIMAL(28,10),   
         CONVERT(DECIMAL(16,15), 
           LEFT(CONVERT(VARCHAR(50), x, 2),17)) 
         * POWER(CONVERT(DECIMAL(38,19),10), 
           RIGHT(CONVERT(varchar(50), x,2),4)))      
FROM @myTable; 

結果:

x     d      NewDec 
------------------ ---------------------- ---------------------- 
280712929.22  280712929.2200000300 280712929.2200000000 
364322379.5731  364322379.5731000300 364322379.5731000000 
10482308902   10482308902.0000000000 10482308902.0000000000 
-0.628475064730907 -0.6284750647   -0.6284750647 
関連する問題