2010-06-23 5 views
1

La fonction de module dans Microsoft SQL Server ne fonctionne que sur certains types de données.Comment calculer le module d'un flottant dans TSQL?

Selon le MSDN article [1] sur l'opérateur de module, vous utiliseriez normalement module comme ça ...

dividend % divisor 

dividend 
Is the numeric expression to divide. dividend must be a valid 
expression of any one of the data types in the integer and 
monetary data type categories, or the numeric data type. 

divisor 
Is the numeric expression by which to divide the dividend. 
divisor must be any valid expression of any one of the data 
types in the integer and monetary data type categories, or 
the numeric data type. 

Cependant, cela ne fonctionne pas lorsque le dividende est un type de données float. La réponse que nous avons trouvée est listée ci-dessous pour référence future.

[1] http://msdn.microsoft.com/en-us/library/ms190279.aspx

+2

C'est parce que si vous faites des calculs mathématiques vous ne devriez pas stocker des données dans le type float. C'est un type de données inexact et entraînera des problèmes d'arrondi. – HLGEM

+0

Bon point. Je n'ai pas pensé au problème passé le message d'erreur. Merci pour ce peu de sagesse. –

Répondre

4

Convertit en décimal/numérique, modulo et renvoyé?

CAST(CAST(TheInaccurateFloatValue AS decimal(38,19)) % ModuloValue AS float) 
+0

Une autre bonne solution. –

1

Telle est la réponse que je suis venu avec. Cela s'applique seulement si le dividende est un flottant, pas le diviseur aussi.

(cast(dividend as integer) % divisor) + (dividend - cast(dividend as integer)) 
1
declare @A float = 2.5 
declare @B float = 1.1 

-- Expected: A % B = 2.5 % 1.1 = 0.3 

select @A - floor(@A/@B) * @B