Modulo (%) travaille avec Décimale de type de données, mais pas avec flotteur ou réel. POURQUOI?
Pourquoi modulo fonctionne très bien avec décimale, mais pas avec flotteur/réel
MSDN états à ce sujet "doit être une expression valide de l'un des types de données integer et monétaire catégories de types de données, ou le type de données numérique." pourquoi ne pas les valeurs flottantes, parce que c'est une valeur approximative ??
--Runs fine
declare @pri decimal
set @pri = 3.25
select @pri%2
Résultat 1
--Gives an error 402
declare @pri float
set @pri = 3.25
select @pri%2
Msg 402, Niveau 16, État 1, Ligne 3
Les types de données float et numérique sont incompatibles avec l'opérateur modulo.
- La version de SQL Server utilisez-vous? Le premier me donne une erreur dans SQL Server 2000, trop.
- Bien que je ne peux pas l'affirmer, je pense que vous avez raison, l'erreur d'arrondi que vous obtenez de l'binaire IEEE754 types float et double précision) fait de la langue concepteurs interdire modulo sur eux. Avec numeric et decimal vous pouvez spécifier une précision et l'échelle. C'est juste une supposition, mais, JavaScript et C, par exemple, sont plus qu'heureux de vous laisser mod sur flotteurs et en double (c'est
fmod
en C, bien sûr). - Protal: C'est parce que la première tente d'initialiser un point fixe, variable avec une virgule flottante un.
- quelle est la version?
- Sql Server 05-08
Vous devez vous connecter pour publier un commentaire.
Si votre question a propos de la documentation?
La documentation MSDN
Il est dit entier, monétaire (l'argent, smallmoney) et numérique
Donc, virgule n'est pas pris en charge. La documentation dit "numérique est fonctionnellement identique virgule", mais peut-être qu'il a une signification différente dans un contexte comme celui-ci.
Je suppose, le float est traitée comme type de données numérique où comme séparateur décimal n'est pas
Lire la types de données. Il a des informations sur monétaires types de données. (de l'argent, smallmoney)
Mise à jour:
Ici est la catégorie sage de données de type liste. Vous pouvez suivre les liens numérique et de l'argent pour trouver ce types de données tombe
Peut-être que la restriction est destinée à vous protéger contre des résultats inattendus. Modulo opérations ont tendance à donner sauvagement des résultats inattendus lorsque utilisé avec inexact de l'arithmétique.
L'entier et monétaire types numériques sont adaptés pour l'arithmétique exacte tout en virgule flottante binaire n'est pas adapté. Par exemple, vous attendez-vous à 0,3 % 0,01 à vous donner exactement zéro, un nombre proche de zéro, ou un nombre proche de 0.01? Types monétaires pouvez le faire exactement. Les résultats à l'aide binaire à virgule flottante sont plus surprenants.
Parce que
float
etreal
représenter des nombres réels, qui peut toujours être divisée sans reste. La définition de modulo est:a mod n = r
, sia = n*q + r
, oùa
,n
,q
etr
sont entiers, pour la plus petite valeur absolue der
.Rechercher http://en.wikipedia.org/wiki/Modulo_operation
Pour d'autres, non-entier, mais point fixe variables d'une définition de modulo peut être trouvé, car deux virgule fixe les valeurs ne peuvent pas toujours être divisé sans reste. Cependant, en général, vous voulez seulement utiliser un modulo pour l'arithmétique des nombres entiers, sinon vous obtiendrez des résultats différents de ce que vous pourriez attendre.
- Ce que vous essayez d'atteindre ici? Modulo est un entier de l'opérateur, il calcule le reste de la division entière.
Si vous vous attendez à 1,25 comme résultat convertir
pri
à un entier, faire la division (cela vous donnera 1) multiplier par 2 et soustraire le résultat depri
(3.25 - ((3/2) *2).