2016-04-28 6 views
1

は、私はこのような表を作成します。floatの小数点以下の桁数は何ですか?

CREATE TABLE [dbo].[tblBar1M](
    [utcDT] [datetime2](7) NOT NULL, 
    [Ticker] [text] NOT NULL, 
    [FwdAdjMultiplier] [float] NULL, 
    [FwdAdjOpen] [float] NULL, 
    [FwdAdjHigh] [float] NULL, 
    [FwdAdjLow] [float] NULL, 
    [FwdAdjClose] [float] NULL, 
    [ActualClose] [float] NULL, 
    [ActualLastBid] [float] NULL, 
    [ActualLastAsk] [float] NULL, 
    [Volume] [float] NULL, 
    [Seq] [float] NOT NULL, 
CONSTRAINT [PK_tblBar1M] PRIMARY KEY CLUSTERED 
(
    [Seq] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

私はINSERTコマンドのように作成します。

commandText = "INSERT INTO BT..tblBar1M VALUES(@utcDT,@Ticker,@FwdAdjMultiplier,@FwdAdjOpen,@FwdAdjHigh,@FwdAdjLow,@FwdAdjClose,@ActualClose,@ActualLastBid,@ActualLastAsk,@Volume,@Seq)"; 

    cmdInsertBar1M = new SqlCommand(commandText, conn); 
    cmdInsertBar1M.Parameters.Add("@utcDT", SqlDbType.DateTime2); 
    cmdInsertBar1M.Parameters.Add("@Ticker", SqlDbType.NVarChar); 
    cmdInsertBar1M.Parameters.Add("@Seq", SqlDbType.Float); 
    cmdInsertBar1M.Parameters.Add("@FwdAdjMultiplier", SqlDbType.Float); 
    cmdInsertBar1M.Parameters.Add("@FwdAdjOpen", SqlDbType.Float); 
    cmdInsertBar1M.Parameters.Add("@FwdAdjHigh", SqlDbType.Float); 
    cmdInsertBar1M.Parameters.Add("@FwdAdjLow", SqlDbType.Float); 
    cmdInsertBar1M.Parameters.Add("@FwdAdjClose", SqlDbType.Float); 
    cmdInsertBar1M.Parameters.Add("@ActualClose", SqlDbType.Float); 
    cmdInsertBar1M.Parameters.Add("@ActualLastBid", SqlDbType.Float); 
    cmdInsertBar1M.Parameters.Add("@ActualLastAsk", SqlDbType.Float); 
    cmdInsertBar1M.Parameters.Add("@Volume", SqlDbType.Float); 

そして、私はパラメータを入力します。あなたはVS約コメントに見ることができるように

double FwdAdjMultiplier = 1.25; 
double baropenMid = 0.727735 

cmdInsertBar1M.Parameters["@FwdAdjOpen"].Value = (float)Math.Round(baropenMid * FwdAdjMultiplier,6); 

float f = (float)Math.Round(baropenMid * FwdAdjMultiplier, 6); 
//f = 909.668762 

を検査fは6 DPです。しかし、SSMSのテーブルに挿入した後は、FwdAdjOpen(***に囲まれています)にはさらに多くのDPがあります。

なぜですか?

utcDT Ticker FwdAdjMultiplier FwdAdjOpen FwdAdjHigh FwdAdjLow FwdAdjClose ActualClose ActualLastBid ActualLastAsk Volume Seq 
2016-04-28 14:23:00.5885822 GL 1.25 ***909.668762207031*** 909.825012207031 904.681274414063 906.150024414063 724.919982910156 724.640014648438 725.200012207031 509600 6 
+0

ここで、間違ったデータを見ていますか? SQL Server Management Studioでは? –

+0

はい。私はこの質問を調整しました – ManInMoon

+0

質問はすでに答えられていますが、FYI、 'baropenMid'と' FwdAdjMultiplier'の値はあなたが与えた値に乗算されません。あなたのコードの 'f 'は' 0.909669'を返します – Quantic

答えて

3

T-SQL FLOATは倍精度です。 C#floatは単精度です。 C#がfloatと呼ぶものはT-SQLのREALです。あなたが得ているのは実質的に(double) 909.668762fです。

精度が必要な場合はdoubleを、そうでない場合はREALをSQL Serverに使用してください。 Books Onlineを参照してください。

+1

'Console.WriteLine((double)909.668762f);'実際OPの質問である '909.668762207031'の値を表示します。 – Quantic

+0

不思議の国のアリス、なぜdownvote?それは正しいと思われ、質問に答えます。 – user1666620

+0

Duh!明白な - ありがとう – ManInMoon

0

フロートも、あなたフロートラウンドあれば、それはので、値は異なるものになりますundelyingだ、(それが正確にフロート表現可能な値に収まる場合を除く)、本質的にprecissionエラー、あなたが具体的な値を表すことができない持っているので、データベースの最終的な価値にはより多くの小数があります。

これは、山車の上にあなたのprecissionエラーの詳細を与えることができます。Floating point inaccuracy examples

関連する問題