为什么当我运行下面的代码(应在表中插入值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()
最佳答案
double
表示IEEE754。 IEEE754不能表示每个值。 122387593.6
很有可能在IEEE754中不存在,并且122387593.59999999
是最接近的近似值。
如果您需要的值与我们头脑一致的人所期望的“精确”近似值相匹配(请注意矛盾之处),则应使用decimal
,而不是double
。
需要明确的是:decimal
和double
都被迫近似-只能做很多事情来将一定范围的可能值装入有限字节。但是它们的近似方式不同。 decimal
适用于金钱之类的离散测量; double
适用于连续测量。