penso che dovrebbe essere compreso che cosa sta succedendo dietro le quinte per riferimento futuro in casi analoghi.
I valori numerici letterali con punto decimale esclusa la notazione scientifica rappresentano il tipo di dati decimale che viene archiviato come il tipo Decimale più piccolo possibile. Stessa citazione come Lieven Keersmaekers di da: https://msdn.microsoft.com/en-us/library/ms191530%28SQL.90%29.aspx#_decimal
In istruzioni SQL, una costante con un punto decimale viene automaticamente convertito in un valore dato numerico, utilizzando il minimo precisione e scala necessaria. Ad esempio, la costante è 12.345 convertito in un valore numerico con una precisione di 5 e una scala di 3.
Gli zeri finali a destra del punto decimale specificare scala. Gli zero iniziali a sinistra del punto decimale vengono ignorati.
Alcuni esempi:
1.0 -> Decimal(2,1)
60.0 -> Decimal(3,1)
1.00 -> Decimal(3,2)
01.0 -> Decimal (2,1)
Un altro punto da considerare è Data Type precedence. Quando un operatore combina due espressioni di diversi tipi di dati, le regole per la precedenza sul tipo di dati specificano che il tipo di dati con la precedenza più bassa viene convertito nel tipo di dati con la precedenza più alta. E ancora un altro punto da considerare è se eseguiamo operazioni aritmetiche su tipi decimali che il tipo Decimale risultante, vale a dire precisione e scala dipendono da entrambi gli operandi e l'operazione stessa. Questo è descritto nel documento Precision, Scale, and Length.
Quindi, una parte della vostra espressione tra parentesi
(1.0/60.0) is evaluated to 0.016666 and the resulting type is Decimal (8,6)
utilizzando sopra le regole circa precisione e la scala di espressioni decimali. Inoltre viene utilizzato l'arrotondamento o l'arrotondamento del banchiere. È importante notare che vengono utilizzati arrotondamenti diversi per il tipo decimale e float. Se continuiamo l'espressione
1.0/0.016666 is evaluated to 60.002400096 and the resulting type is Decimal (17,10)
Così la parte della differenza è dovuta alla differente arrotondamento usato per i tipi decimali rispetto a galleggiante.
In base alle regole precedenti, sarebbe sufficiente utilizzare una sola fusione tra parentesi. Ogni altro letterale sarà promosso a fluttuare secondo le regole di Precedenza del tipo di dati.
1.0/(1.0/cast(60.0 as float))
E un'altra cosa IMPORTANTE. Anche questa espressione mobile non calcola il risultato esatto. È solo così che il front-end (SSMS o qualsiasi altra cosa) arrotonda il valore a (credo) di 6 cifre di precisione e poi tronca gli zeri finali. Quindi, ad esempio, 1.000001 diventa 1.
Semplice, non è vero?
Ah .. Non conoscevo questo metodo fino ad ora. Grazie mille :) – VVS
Quindi non c'è modo di aggirare un cast esplicito per ottenere il risultato atteso? C'è un altro modo per dire a SQL Server che un determinato valore letterale è di tipo (ad es. Float? – VVS
@VVS, oltre a un cast esplicito come si sta già facendo, non che io sappia. SQL Server interpreta sempre il valore come numerico.Il problema può essere alleviato un po 'se tu stesso aggiungi precisione ai tuoi valori come 1.000000000000000000000000000000000000. –