3

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

4 回答 4

10

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

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

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

于 2013-04-25T13:32:04.743 回答
3

不要使用Double.Parse. 你需要使用Decimal.

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

于 2013-04-25T13:31:01.457 回答
1

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

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

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

于 2013-04-25T13:35:13.357 回答
-3

使用功能

  ROUND ( numeric_expression , length [ ,function ]  )
于 2013-04-25T13:34:54.643 回答