2016-07-28 9 views
2

浮動小数点を文字列に変換する際に問題がありますが、t-sqlは科学的形式で返します。floatをnvarcharに変換して10進変数の部分を保持

例:

declare @amount float 
set @amount=5223421341.23 
print cast(@amount as nchar(20)) 

戻っ "5.22342e + 009"

さて私は、関数STRを試みたが、ポイントがあります:私はfloat型とIを持つことができますどのように多くの小数点以下を知りませんそれを丸めたいとは思わない。

floatが宣言されているのと同じ精度でncharとしてfloatを返す方法がありますか?

ありがとうございます。

+0

明らかにそうではありません。 'float'の代わりに' Decimal'を使うことができない理由はありますか? –

答えて

1

小数点以下の桁に問題があります。以下のコードは、小数点の値が歪められていることを示しています。浮動小数点の精度を決定する方法があった場合、結果は正しい値に丸められます。

未知の精度で、私はまだ解決策を見つけていません。

Declare @Amount float 
Set @Amount=5223421341.23 

Select LTrim(RTrim(Str(@Amount, 1000, 1000))) 

が生成されます私は山車を読んでいるかに基づい5223421341.2299995000000000

ので、これはあなたが得ることができる最高のかもしれ定義によってのみ近似値です。

https://msdn.microsoft.com/en-us/library/ms173773.aspx

http://www.webopedia.com/TERM/F/floating_point_number.html

最も浮動小数点数のコンピュータが表現できることを注意 だけで近似値です。 浮動小数点値を使用してプログラミングする際の課題の1つは、近似値が という合理的な結果につながることを保証することです。プログラマが慎重でない場合、小さい 近似の矛盾は、 最終結果が無意味になる点まで雪が降ることがあります。

0

には、Microsoft SQL Serverのマニュアルによると、(https://msdn.microsoft.com/en-us/library/ms173773.aspxfloatfloat(53)の同義語であり、float(53)は、15桁の精度を持っています。

しかし、15桁の精度では指数について何も言わない。指数は約300です。つまり、浮動小数点数は約300個のゼロを含む数値を表すことができます。科学記法は不可欠です。

科学的な表記法が問題にならなかった場合は、21文字で15桁の数字を入力できます。また、末尾にe+999を追加します。

しかし、科学的表記があなたのための問題であることから、その後、フォーム 0.0000000000000000000000000000000の番号を保持するのに十分な大きさのテキストフィールドを持っている必要が... 00000000000000000000000000723237435435644 (つまりは、15桁の数字が続き、ほぼ300ゼロです) と 377733453453453000000000000000000 ... 00000000000000000000000000000000000000 (これは15桁で、その後にほぼ300個のゼロが続きます。)

明らかに、あなたは何をしようとしているのかかなり大きなテキストフィールドが必要になるでしょう。

したがって、結論は問題の解決策を述べる代わりに、ここで達成しようとしていることを改訂することをお勧めします。

0

Microsoftによれば、SQLの最良の方法はSTR関数を使用する可能性があります。

declare @amount float 
set @amount=5223421341.23 
print str(@amount,20,6) 
print convert(VARCHAR(50),rtrim(ltrim(str(@amount,20,6)))) 

それはほとんどのシナリオをカバーするようにこれが見えますが、あなたはあなたのデータセットとも最大精度で最大値と最小値を見つける必要があります。

+0

精度がわからないため、これは機能しません。 str関数で6から8を変更すれば、同じ問題が発生します。 –

+0

しかし、6よりも精度の高い浮動小数点数がないことが分かっていれば、すべてが良好です。これはおそらくフィールドと変換フィールドを合計して、それらが等しいかどうかを確認することによって真実として確立することができます – UnhandledExcepSean

+0

ええ、彼は彼が精度を知らないと述べています... –

関連する問題