Не понимаю поведение округления в SQL Server при использовании оператора деления - PullRequest
1 голос
/ 15 декабря 2010

Может кто-нибудь объяснить, что происходит в следующем коде SQL?

объявить @dividend числовой (38,22)

объявить @divisor числовой (38,22)

объявите @otherDivisor int

set @dividend = 1

set @divisor = 3

set @otherDivisor = 3

выберите приведение (@dividend / @divisor как числовой (38,22)), @dividend / @ otherDivisor

Возвращенный результат:


0,3333330000000000000000 0,3333333333333333333333

Я бы ожидал одинакового результата для обоих расчетов.

Ответы [ 3 ]

0 голосов
/ 15 декабря 2010

Попробуйте это:

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

Вы кастуетесь после выполнения деления.

0 голосов
/ 15 декабря 2010

десятичное (38,22) / десятичное (38,22) заканчивается десятичным (x, 6) следующим этим правилам

Итак, у вас есть 0.33333, прежде чем вы вернётесь к десятичной дроби (38,22)

@ otherDivisor приводится к (38, 0) и остается десятичным (x, 22)

См. Мой обработанный пример

0 голосов
/ 15 декабря 2010

На самом деле я принимаю этот ответ обратно. Похоже, что SQL принуждает результат к тому, что имеет более высокий приоритет, дивиденд или делитель.

      select 1.00000000000000000000/3.0
      select 1.0/3.0
...