为什么当我运行下面的代码时,它应该插入一个值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 不能表示每一个值。很可能在IEEE754中122387593.6
不存在, 122387593.59999999
是最接近的近似。
如果您需要的值与我们肉头人类倾向于同意的"精确"近近值相匹配(注意术语中的矛盾),您应该使用decimal
,而不是double
。
需要明确的是:decimal
和double
都是强制近似的-只有这么多你可以做的是在有限的字节中适应这样一个可能的值范围。但是它们近似的方式是不同的。decimal
适用于像货币这样的离散度量;double
适用于连续测量
不要使用Double.Parse
。你需要使用Decimal
.
您的对象a
已经是122387593.59999999,因为这是122387593.6必须在浮点标准中表示的方式,这就是double的含义。
问题在于。net中的double精度。如果在这行
之后签出变量a
Dim a = Double.Parse("122387593.6", Globalization.CultureInfo.InvariantCulture)
你会注意到它已经有了错误的值。你可以尝试使用decimal
,它更精确。
use function
ROUND ( numeric_expression , length [ ,function ] )