2

次の結果に非常に混乱しています。

PRINT 3.1415926535897931 /180

コンソール結果 = 0.01745329251994329500

DECLARE @whatTheHell float(53)
SET @whatTheHell  = 3.1415926535897931/180
PRINT @whatTheHell 

コンソール結果 = 0.0174533

これを参照しているため、わかりません:

http://msdn.microsoft.com/en-us/library/ms131092.aspx

Sql Server Float は、c# の double と同等である必要があります。しかし、これをC#で計算すると:

double hellYeah = 3.1415926535897931 /180;

私は0.017453292519943295を取得します...

4

6 に答える 6

7

関数のデフォルト設定である 10 の長さ ( MSDNPRINTを参照) で暗黙的に数値を文字に変換するという事実に混乱していると思います。試してみると、あなたはもっと幸せになるかもしれません。STRPRINT STR(@wth, 20, 16)

于 2009-06-12T15:50:27.143 に答える
4

除算は丸められません。PRINT は丸めています。

DECLARE
  @var1 float,
  @var2 float,
  @var3 float

SET @var1 = 3.1415926535897931
SET @var2 = 180

SET @var3 = @var1 / @var2
SELECT @var1/@var2 as Computed, @var3 as FromVariable

PRINT @var1/@var2
PRINT @var3
于 2009-06-12T15:43:34.740 に答える
3

「FLOAT」型には精度の制限があるだけだと思います。Books Online によると、FLOAT(53) では最大 15 桁の精度が得られるはずです。これらの桁が小数点記号の前後にあるかどうかに固有の制限があるかどうかはわかりません。

代わりに 10 進数を使用してみてください。

DECLARE @whatTheHell2 decimal(18,16)
SET @whatTheHell2  = 3.1415926535897931/180
PRINT @whatTheHell2 

結果が得られます:

0.0174532925199433

マルク

于 2009-06-12T15:26:37.997 に答える
1

SQL Server 2005 Books Online のデータ型変換トピックから:

Transact-SQL ステートメントでは、小数点を含む定数は、必要最小限の精度と位取りを使用して、自動的に数値データ値に変換されます。たとえば、定数 12.345 は、精度が 5 で位取りが 3 の数値に変換されます。

したがって、以下は SQL Server が暗黙的に行っていることをよりよく表しています。

DECLARE @whatTheHell NUMERIC(21, 20)
SET @whatTheHell = 3.1415926535897931 / 180
PRINT @whatTheHell
于 2009-06-12T15:29:31.170 に答える
1

PRINT 3.1415926535897931 /180は 10 進数として評価されています。

Float は有効数字 15 桁にのみ解決されます。あなたは17を持っているので、フロートすることはできません。180 は暗黙的な変換によって 10 進数になります。これは、データ型の優先順位と、出力のスケールと精度がこれらの規則に基づいているためです。

出力 0.01745329251994329500 にも 17 個の sig figs があります。10 進数でなければなりません。

さて、SET @whatTheHell = 3.1415926535897931/180. float 変換は代入演算子の一部として行われます。その前は右辺も10進数です。浮動小数点数は概算で、丸めています。

C# では、固定小数点がないため、すべて double です(コンパイラに指示しない限り?)

関連する質問:

decimal(x,y) の適切な精度の選択

SQLでmoneyデータ型を10進数に変換するにはどうすればよいですか?

SQL Server の where 句はさまざまなタイプとデフォルトのキャスト動作と比較されます

于 2009-06-12T19:41:46.867 に答える
0

SQL float が C# double にマップされると言うとき、SQL float バイト サイズが C# double バイト サイズと同じであると想定していると思います。

C# double は、C# で SQL float を格納するのに十分な大きさの唯一の浮動小数点データ型であると言えます。

例:

C# Double = 8 バイト Sql Float = 4 バイト

問題を簡単に解決するには、SQL で 10 進数または数値を使用します。

于 2009-06-12T15:53:45.950 に答える