2010-12-15 84 views
1

Quelqu'un peut-il expliquer ce qui se passe dans le code sql suivant?Ne pas comprendre le comportement d'arrondi dans le serveur SQL lors de l'utilisation de l'opérateur de division

declare @dividend numérique (38,22)

declare @divisor numérique (38,22)

declare @otherDivisor int

ensemble @dividend = 1

ensemble @divisor = 3

set @otherDivisor = 3

select coulée (@dividend/@divisor comme numérique (38,22)), @dividend/@otherDivisor

Le résultat renvoyé est


0,3333330000000000000000 0,3333333333333333333333

Je m'attendrais au même résultat pour les deux calculs.

Répondre

0

décimal (38,22)/décimale (38,22) se termine avec décimales (x, 6) suivant these rules

Vous avez donc 0,33333 avant rejetterait en décimal (38,22)

@otherDivisor est castée (38, 0) et reste en décimal (x, 22)

Voir ma travaillé example

+0

Merci beaucoup pour la réponse. Connaissez-vous un moyen de contourner ce problème? – ralf

+0

@Ralf: Il suit des règles mathématiques normales, tout comme la multiplication des décimales dans la vie réelle (2dp x 3 dp donne 6 dp). Float peut-être mieux, au détriment d'une certaine précision ... – gbn

0

En fait, je reprends cette réponse. Il semble que SQL contraint le résultat à celui qui a la plus haute priorité, dividende ou diviseur.

 select 1.00000000000000000000/3.0 
     select 1.0/3.0 
0

Essayez ceci:

select cast(@dividend as numeric(38,22))/@divisor, @dividend/@otherDivisor 

Vous jettes après avoir fait la division.