2010-12-15 3 views
1

Könnte jemand erklären, was im folgenden SQL-Code passiert?Verstehen Sie nicht Rundung Verhalten in SQL Server bei der Verwendung von Division Operator

declare @dividend numeric (38,22)

declare @divisor numeric (38,22)

declare @otherDivisor int

set @dividend = 1

set @divisor = 3

set @otherDivisor = 3

select Besetzung (@dividend/@divisor als numerische (38,22)), @dividend/@otherDivisor

Das Ergebnis zurückgegeben wird


0,3333330000000000000000 0,3333333333333333333333

Ich würde für beide Berechnungen dasselbe Ergebnis erwarten.

Antwort

0

dezimal (38,22)/Dezimal (38,22) endet mit Dezimalstelle (x, 6) nach these rules

So Sie 0,33333 haben, bevor Sie auf Dezimal zurückgeworfen (38,22)

@otherDivisor wird gegossen (38, 0) und bleibt als Dezimalzahl (x, 22)

Meine arbeitete example

+0

Ihnen sehr für die Antwort danken. Ist Ihnen bewusst, wie Sie dieses Verhalten umgehen können? – ralf

+0

@Ralf: Es folgt normalen mathematischen Regeln, genau wie die Multiplikation von Dezimalstellen im wirklichen Leben (2dp x 3 dp ergibt 6 dp). Float kann besser sein, auf Kosten einiger Genauigkeit ... – gbn

0

Eigentlich nehme ich diese Antwort zurück. Es sieht so aus, als würde SQL das Ergebnis auf den höheren Vorrang, Dividend oder Divisor zwingen.

 select 1.00000000000000000000/3.0 
     select 1.0/3.0 
0

Try this:

select cast(@dividend as numeric(38,22))/@divisor, @dividend/@otherDivisor 

Du Gießen nach der Teilung zu tun.

Verwandte Themen