2010-11-30 6 views
0

J'ai divisé 500/15 puis multiplié le résultat par 15 mais j'ai des résultats différents sur les différentes Précision et Échelle.DECIMAL (Précision, Echelle) pour obtenir une précision maximale dans les calculs

Veuillez exécuter le script suivant.

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 

J'ai besoin de stocker ce calcul dans db et je besoin de précision maximale. Ce n'est pas une application scientifique, mais le client doit l'avoir. Ce que je veux savoir, j'ai besoin de la précision qui me donne Decimal (36, 5). Dois-je utiliser cela parce qu'il a besoin de 17 octets? Quelle devrait être la meilleure approche pour obtenir la précision que j'ai expliqué dans les exemples?

+0

Quelle est la nature des données, par ex. de quel domaine est votre valeur '15'? Qu'est-ce que le «coût», spécifiquement? – onedaywhen

+0

Le coût est décimal (9,2) et 15 est int. – Kashif

Répondre

1

Le problème avec la conversion est que DECIMAL (36, 4) n'est techniquement pas suffisant pour stocker le résultat intermédiaire de la division de 500 par 15. SQL Server l'estime correctement comme FLOAT.

La bonne façon de le faire serait de multiplier d'abord, puis diviser.

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 
Questions connexes