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

doubleIEEE754 を意味します。IEEE754では、すべての値を表現することはできません。が IEEE754 に122387593.6 存在しない可能性は十分にあり、それ122387593.59999999が最も近い近似値です。

私たち肉食人間が「正確な」近似として同意する傾向がある値と一致する値が必要な場合 (用語の矛盾に注意してください)、decimalではなくを使用する必要がありますdouble

明確にするために:decimalとの両方doubleを概算する必要があります。このような範囲の可能な値を有限バイトに収めるためにできることは限られています。しかし、それらの近似方法は異なります。decimalお金のような個別の測定に適しています。double連続測定に適しています。

于 2013-04-25T13:32:04.743 に答える
3

使用しないでくださいDouble.Parse。を使用する必要がありますDecimal

オブジェクトaはすでに 122387593.59999999 です。これは、122387593.6 が倍精度浮動小数点標準で表現される方法であるためです。

于 2013-04-25T13:31:01.457 に答える