Sam*_*kin 3 .net vb.net sql-server stored-procedures sql-server-2008-r2
为什么当我运行下面的代码,它应该在表中插入值122387593.6时,它是否插入值122387593.59999999?
我跟踪了.net的调用,可以看到值被传入122387593.59999999到SQL,但调试时参数值返回为122387593.6?!
我无法弄清楚为什么.NET会这样做 - 非常感谢任何帮助.
---SQL Code
CREATE TABLE [dbo].[tblNum](
[Num] [numeric](28, 8) NOT NULL
) ON [PRIMARY]
CREATE PROCEDURE spNumInsert (@Num numeric(28,8))
AS
BEGIN
INSERT INTO tblNum VALUES(@Num)
END
GO
--.NET Code
Dim a = Double.Parse("122387593.6", Globalization.CultureInfo.InvariantCulture)
Dim con As SqlConnection = New SqlConnection("Server=server;Database=database;Trusted_Connection=True;")
Dim com As SqlCommand = New SqlCommand("spNumInsert", con)
com.CommandType = CommandType.StoredProcedure
com.Parameters.Add(New SqlParameter("@Num", a))
con.Open()
com.ExecuteNonQuery()
con.Close()
con.Dispose()
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 10
double表示IEEE754.IEEE754 无法表达每一个值.很可能在IEEE754 122387593.6 中不存在,这122387593.59999999是最接近的近似值.
如果你需要与我们肉食人类倾向于认同的价值相匹配的"精确"近似值(注意术语中的矛盾),你应该使用decimal,而不是double.
要明确:既decimal和double被迫近似-只有这么多,你可以做,以适应这样的可能值的范围为有限字节.但是,这样他们近似是不同的.decimal适用于金钱等离散测量; double适用于连续测量.