为什么当我运行下面的代码(应在表中插入值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

需要明确的是:decimaldouble都被迫近似-只能做很多事情来将一定范围的可能值装入有限字节。但是它们的近似方式不同。 decimal适用于金钱之类的离散测量; double适用于连续测量。

10-01 23:20