2010-11-30 22 views
0

私は500/15に分割し、その結果に15を掛けます。異なる精度とスケールで結果が異なります。計算精度を最大限に引き出すためのDECIMAL(精度、スケール)

次のスクリプトを実行してください。

DECLARE @cost DECIMAL(36,4) 
SET @cost = 500 
SELECT @cost/15, (@cost/15) * 15 
-- Scale is 4 so on multlyping, after dividing, result is not 500 
-- Result = 33.333333, 499.999995 

DECLARE @cost2 DECIMAL(36,5) 
SET @cost2 = 500 
SELECT @cost2/15, (@cost2/15) * 15 
-- Scale is 5 so on multlyping, after dividing, result is 500 
-- Result = 33.3333333, 500.000000 

DECLARE @cost3 DECIMAL(32,5) 
SET @cost3 = 500 
SELECT @cost3/15, (@cost3/15) * 15 
-- Precision decrease to 32 from 36 result is again not 500 
-- Result = 33.33333333, 499.99999995 

私はこの計算をdbで保存する必要があります。正確な計算が必要です。これは科学的なアプリケーションのいくつかの種類ではなく、クライアントがこれを持っている必要があります。

私はそれが私にDecimal(36,5)を与える精度が必要であることを知りたいと思います。私は17バイトが必要なのでこれを使うべきですか? 例で説明した精度を得るためのより良いアプローチは何でしょうか?

+0

データの性質は何ですか。あなたの「15」の価値はどのドメインからですか?特に「コスト」とは何ですか? – onedaywhen

+0

コストは10進数(9,2)で、15はintです。 – Kashif

答えて

1

変換の問題は、DECIMAL(36、4)が技術的には500の除算の中間結果を格納するには不十分であるということです.SQL ServerはFLOATとして正しく見積もります。

正しい方法は、最初に乗算してから除算することです。

DECLARE @cost DECIMAL(36,4) 
SET @cost = 500 
SELECT @cost/15, @cost*15/15 
-- Scale is 4 so on multlyping, after dividing, result is not 500 
-- Result = 33.333333, 500