0

以下のコードを見て、最終結果に逸脱がある理由を説明してください。違いは、2番目の計算での括弧の導入であることに注意してください。ありがとう!

コード:

DECLARE  @A decimal(38,19) = 7958011.98
DECLARE  @B decimal(38,19) = 10409029441
DECLARE  @C decimal(38,19) = 10000000000

DECLARE  @Z1 decimal(38,19)
DECLARE  @Z2 decimal(38,19)


SET @Z1 = @A * @B / @C
SET @Z2 = @A * (@B / @C)

SELECT  @Z1 AS [Correct], 
        @Z2 AS [Wrong]

結果:

Correct = 8283518.0991650000000000000
Wrong   = 8283510.5860060000000000000
4

1 に答える 1

1

このMSDNの記事のため、中間データ型は異なります

つまり、(@B / @C)最初に評価され、次のようなルールに従います。中間データ型は、@A

ここで中間型と最終型を確認できます(decimal(38,19)型に割り当てる前)

SELECT
     @A * @B,        -- decimal (x, 6)
     @A * @B / @C,   -- decimal (x, 6)
     (@B / @C),      -- decimal (x, 6)
     @A * (@B / @C)  -- decimal (x, 6)

したがって、1.0409029441の代わりに、2番目の数学で1.040902取得します

あなたの1番目も間違っていることに注意してください。実際には8283518.099165070318です

于 2013-01-07T13:30:45.073 に答える