2017-03-08 4 views
1

Könnte jemand das Verhalten dieser Abfrage erklären:SQL Berechnung Ausgabe Präzision

SELECT 
    0.1 + 0.01, 
    '', 
    (CAST(0.1 AS numeric(18,1)))+(CAST(0.01 AS numeric (18,2))), 
    0.1 + (CAST(0.01 AS numeric (18,2))), 
    (CAST(0.1 AS numeric(18,1)))+ 0.01, 
    '', 
    (CAST(0.1 AS numeric(38,1)))+(CAST(0.01 AS numeric (38,2))), 
    0.1 + (CAST(0.01 AS numeric (38,2))), 
    (CAST(0.1 AS numeric(38,1)))+ 0.01 

Ich verstehe nicht, warum die 38 verhält sich anders als bei der 18?

Ich erwartete, dass SQL Server immer automatisch ein Berechnungsergebnis mit der Genauigkeit zurückgeben würde, die notwendig ist, um das Ergebnis genau anzuzeigen? Um das zu ändern, müssten Sie das Ergebnis explizit umsetzen?

+0

http://dba.stackexchange.com/a/ 41745/95107 und Sie werden bemerken, da Sie nur 2 Präzision verwenden, die Verwendung von 37 für die Waage wird die gleichen Ergebnisse wie 18 zurückgeben – scsimon

Antwort

1

Es folgt die hier Regeln: Precision, Scale, and Length (Transact-SQL) - msdn

Wenn Sie die maximale Präzision verwenden, nicht in der Lage ist, den Maßstab, ohne riskieren zu verlieren Präzision einzustellen.

Chart for Data Type Conversion (Database Engine) - msdn

Wenn Sie eine float in Ihre Berechnungen eingeführt, würden Sie eine float Rückkehr bekommen.

Standardmäßig werden Werte mit einer Dezimalzahl implizit in dezimale/numerische Datentypen umgewandelt. Diese impliziten Konvertierungen werden als 'und' in einem Beispiel aus Ihrer Frage geändert markiert:

select 
     undefined=0.1 + 0.01 
    ,[18,1+18,2] = (cast(0.1 as numeric(18,1)))+(cast(0.01 as numeric (18,2))) 
    ,[und+18,2+18,1] = 0.1 + (cast(0.01 as numeric (18,2))) 
    ,[18,2+und]=(cast(0.1 as numeric(18,1)))+ 0.01 
    ,[38,1+38,2]=(cast(0.1 as numeric(38,1)))+(cast(0.01 as numeric (38,2))) 
    ,[und+38,2] = 0.1 + (cast(0.01 as numeric (38,2))) 
    ,[38,1+und]=(cast(0.1 as numeric(38,1)))+ 0.01 
    ,[38,1+float]=(cast(0.1 as numeric(38,1)))+ convert(float,0.01) 

rextester Demo: http://rextester.com/ULVRGS77309

kehrt:

+-----------+-----------+---------------+----------+-----------+----------+----------+------------+ 
| undefined | 18,1+18,2 | und+18,2+18,1 | 18,2+und | 38,1+38,2 | und+38,2 | 38,1+und | 38,1+float | 
+-----------+-----------+---------------+----------+-----------+----------+----------+------------+ 
| 0,11  | 0,11  | 0,11   | 0,11  | 0,1  | 0,11  | 0,1  | 0,11  | 
+-----------+-----------+---------------+----------+-----------+----------+----------+------------+