C# 为什么我要为float增加小数点?
我创建如下表:C# 为什么我要为float增加小数点?,c#,sql-server,C#,Sql Server,我创建如下表: 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, [FwdAdjClos
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
我创建插入命令,如下所示:
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);
然后我填充参数:
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
正如您在关于VS检查的评论中所看到的,f有6个DP。但在SSMS的表中插入之后,FwdAdjOpen(被***包围)有更多的DP
为什么?
浮点具有固有的精度误差,无法表示具体的值(除非它与浮点可表示的值完全匹配),因此,即使对浮点进行四舍五入,它的非精确值也会有所不同,因为数据库中的最终值有更多的小数
这可以为您提供有关浮点精度误差的更多详细信息:浮点具有固有的精度误差,您无法表示具体的值(除非它完全符合浮点可表示的值),因此,即使对浮点进行四舍五入,它的非精确值也会有所不同,因此,数据库中的最终值有更多的小数
这可以为您提供有关浮点精度错误的更多详细信息:T-SQL
FLOAT
是双精度。浮点数是单精度的。在T-SQL中,C#调用的float
是REAL
。您得到的是有效的(双精度)909.668762f
如果需要更高的精度,可以在C#中使用
double
,如果不需要,可以在SQL Server中使用REAL
。看 T-SQLFLOAT
是双精度的。浮点数是单精度的。在T-SQL中,C#调用的float
是REAL
。您得到的是有效的(双精度)909.668762f
如果需要更高的精度,可以在C#中使用
double
,如果不需要,可以在SQL Server中使用REAL
。看 您在哪里看到错误的数据?在SQL Server Management Studio中?是。我对问题进行了调整以反映这一点问题已经得到了回答,但仅供参考,baropenMid
和fwdajmultiplier
的值不会与您给出的值相乘f
在您的代码中给出了0.909669
您在哪里看到错误数据?在SQL Server Management Studio中?是。我对问题进行了调整以反映这一点问题已经得到了回答,但仅供参考,baropenMid
和fwdajmultiplier
的值不会与您给出的值相乘<代码中的code>f给出了0.909669
Console.WriteLine((双)909.668762f)
确实打印了OP问题中给出的值,909.668762207031
。出于好奇,为什么要投否决票?它似乎是正确的,并且回答了问题。Console.WriteLine((double)909.668762f)
确实打印了OP问题中给出的值,909.668762207031
。出于好奇,为什么要投否决票?它似乎是正确的,回答了这个问题。
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