2012-03-06 9 views
6

Perché modulo funziona bene con decimali, ma non con galleggiante/reali MSDN stati su di esso "deve essere una valida espressione di uno qualsiasi dei tipi di dati in intero e monetari categorie di tipi di dati, o il tipo di dati numerici." perché non valori fluttuanti, perché è un valore approssimativo ??Modulo (%) funziona con datatype decimale ma non con float o reale. PERCHÉ?

--Runs fine 
declare @pri decimal 
set @pri = 3.25 
select @pri%2 

Risultato 1

--Gives an error 402 
declare @pri float 
set @pri = 3.25 
select @pri%2 

messaggio 402, livello 16, Stato 1, linea 3 I dati tipi float e numerico sono incompatibili nell'operatore modulo.

+0

Quale versione di SQL Server si utilizza? Anche il primo mi dà un errore in SQL Server 2000. –

+0

Anche se non posso dirlo con certezza, penso che tu abbia ragione che l'errore di arrotondamento ottenuto dai tipi IEEE754 binari (float e doppia precisione) ha reso i designer del linguaggio vietati su di essi il modulo. Con valori numerici e decimali è possibile specificare una precisione e una scala. Questa è solo un'ipotesi, tuttavia, JavaScript e C, per esempio, sono più che felici di permetterti di modare su float e double (è 'fmod' in C ovviamente). –

+0

@Ocaso Protal: questo perché il primo tenta di inizializzare una variabile a virgola fissa con una variabile a virgola mobile. – vsz

risposta

2

Se la tua domanda circa la documentazione?

MSDN documentation

dividendo deve essere una valida espressione di uno qualsiasi dei tipi di dati in gli interi e dei tipi di dati monetari categorie, oppure il numerico dati tipo.

Dice intero, monetaria (denaro, smallmoney) e numerico

Quindi, decimale non è supportato. La documentazione dice che "il numerico è funzionalmente uguale al decimale" ma potrebbe avere un significato diverso in alcuni contesti come questo.

immagino, galleggiante è trattata come tipo di dati numerici dove come decimale non è

Leggere il data types. Ha informazioni sui tipi di dati monetari.(Denaro, smallmoney)

Aggiornamento:

Ecco il catagory wise data type list. È possibile seguire i collegamenti a numeri e denaro per trovare quali tipi di dati ci sono in esso

1

Perché float e real rappresentano numeri reali, che possono essere sempre divisi senza resto. La definizione di modulo è:

a mod n = r, se a = n*q + r, dove a, n, q e r sono interi, per il più piccolo valore assoluto possibile r.

Consulti http://en.wikipedia.org/wiki/Modulo_operation

Per altro, non intero ma variabili in virgola fissa una definizione di modulo può essere trovato, perché due valori a virgola fissa non possono sempre essere divise senza resto. Tuttavia, in genere si desidera utilizzare solo il modulo per l'aritmetica dei numeri interi, altrimenti si otterranno risultati diversi da ciò che ci si potrebbe aspettare.

+1

@ Martin Smith: esattamente questo è quello che ho detto. I numeri reali (ad esempio i float) possono essere divisi senza resto, per questo motivo il modulo non è definito per essi. – vsz

0

Cosa stai cercando di ottenere qui? Modulo è un operatore intero, calcola il resto della divisione intera.

Se vi aspettate 1,25 come risultato convertire pri in un intero, fare la divisione (questo vi darà 1) moltiplicare per 2 e sottrarre il risultato da pri (3,25 - ((3/2) * 2)

.
+0

Questa domanda non è correlata ai miei requisiti aziendali. È tutto sulla comprensione dei concetti. –

1

Forse la restrizione ha lo scopo di proteggerti da risultati imprevisti. Le operazioni modulo tendono a dare risultati inaspettati quando vengono usate con aritmetica inesatta.

I tipi di numeri interi e monetari sono adatti per l'aritmetica esatta mentre il punto in virgola mobile non è adatto. Ad esempio, ti aspetti 0,3% 0,01 per darti esattamente zero, un numero vicino allo zero o un numero vicino a 0,01? I tipi monetari possono farlo esattamente. I risultati usando il virgola mobile binario sono più sorprendenti.

Problemi correlati