【问题标题】:Incorrect value being passed in to SQL from .NET sqlcommand从 .NET sqlcommand 传递到 SQL 的值不正确
【发布时间】:2013-04-25 13:28:06
【问题描述】:

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

【问题讨论】:

标签: .net sql-server vb.net stored-procedures sql-server-2008-r2


【解决方案1】:

double 表示 IEEE754。 IEEE754 不能表达每一个值。 122387593.6 很可能在 IEEE754 中不存在,而 122387593.59999999 是最接近的近似值。

如果您需要的值与我们肉头人类倾向于同意的“精确”近似值相匹配(注意术语上的矛盾),您应该使用decimal,而不是double

需要说明的是:decimaldouble 都被强制逼近——你只能做很多事情来将这样一个可能的值范围放入有限的字节中。但是他们近似的方式是不同的。 decimal 适用于像钱这样的离散测量; double 适用于连续测量。

【讨论】:

    【解决方案2】:

    不要使用Double.Parse。您需要使用Decimal

    您的对象 a 已经是 122387593.59999999,因为这就是 122387593.6 必须在浮点标准中表示的方式,这就是 double 的含义。

    【讨论】:

      【解决方案3】:

      问题在于 .NET 中的 double 精度。如果您在此行之后签出变量a

      Dim a = Double.Parse("122387593.6", Globalization.CultureInfo.InvariantCulture)
      

      您会注意到它已经有错误的值。您可以尝试使用decimal 更准确。

      【讨论】:

        【解决方案4】:

        使用功能

          ROUND ( numeric_expression , length [ ,function ]  )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-18
          • 2018-10-28
          • 2011-07-17
          • 2013-08-31
          • 2017-04-02
          • 2020-08-23
          相关资源
          最近更新 更多