2016-07-26 1 views
0

Ma question est:SQL Server 2008+: Modulo et décimal/numérique type de données

Est-il une opération valide pour utiliser l'opérateur modulo % en combinaison avec decimal ou numeric types de données dans T-SQL.

Il semble fonctionner pour autant que je l'ai testé, mais est-ce réellement un comportement prévu pour decimal des valeurs comme SELECT 2.0 % 0.4 pour résultat 0.0 et puis-je compter sur cela?

Mon idée était de créer une requête comme ceci:

SELECT itemNumber 
    FROM item i 
    JOIN orderItem oi ON i.ID = oi.itemID 
    WHERE oi.orderID = @orderID 
    AND oi.amount % i.amount <> 0.0000 

j'été surpris que cela semble fonctionner. Est-ce que ce comportement est prévu?

Je m'attendais à ce que cela ne fonctionne que pour les valeurs entières et était prêt à utiliser quelque chose de différent.

Pour l'arrière-plan:

Nous vendons une partie de nos affaires en mètres sous une forme préemballée. Le champ de données de la base de données est une valeur numeric(18,4) et certaines unités préemballées sont regroupées en valeurs décimales. Maintenant, je dois créer une procédure pour vérifier si cet article vendu est un multiple d'une unité préemballée ou non, déterminez si nous pouvons envoyer une quantité valide d'éléments préemballés de s'il est nécessaire de couper l'article de manière appropriée.

Répondre

1

Il est dangereux d'utiliser l'opérateur % pour les nombres décimaux, car la représentation interne du nombre décimal peut différer de l'attente. Par exemple, vous pouvez obtenir 0.40000000000000001 au lieu de 0.4 et la requête SELECT 2.0 % 0.40000000000000001 renverra 0.39999999999999996. Peut-être, vous devez utiliser la fonction CEILING pour obtenir le nombre d'articles entiers:

SELECT CEILING(2.0/0.40000000000000001) --5 
+0

Avec un numérique (18,4) la précision devrait être assez élevé je pense? – Adwaenyth

+0

@Adwaenyth cela dépend de votre environnement, si vous mesurez 'amount' dans tonns - vous devez ajouter plus de chiffres sur le côté droit, si vous utilisez des gramms, je pense, c'est assez – Backs

+0

C'est mètres en fait. – Adwaenyth