SQL Math оценивает проблему - PullRequest
0 голосов
/ 30 марта 2012

По некоторым причинам эта оценка в sql не работает должным образом, но я не могу понять, почему.

Давайте сначала рассмотрим этот пример.

DECLARE @countRatio decimal(6,3)     
SET @countRatio = (((4)/(2))*(6))/100.0
_______________________________________
0,120

Эта оценка работает как очарование. Я также получаю тот же ответ с моим калькулятором.

Но этот пример дает мне неожиданный ответ.

DECLARE @countRatio decimal(6,3)     
SET @countRatio = (((2)/(4))*(6))/100.0
_______________________________________
0,000

Когда я вычисляю это на своем калькуляторе, ответ 0,03 что по мне правильно Но sql продолжает давать мне 0,000 в качестве ответа. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

Проблема в том, что ((2)/(4)) округляется до INT, поскольку 2 и 4 оба INTs.Если вместо этого вы используете 2.0 или 4.0, вы получите правильный результат:

DECLARE @countRatio decimal(6,3)     
SET @countRatio = (((2.0)/(4))*(6))/100.0
SELECT @countRatio 
==========================
0.030

В любом арифметическом выражении SQL Server приводит к типу оператора, который имеет большую точность.Таким образом, 2.0/4 приводит результат к типу 2.0, который равен float.

2 голосов
/ 30 марта 2012

2 и 4 являются целыми числами, поэтому в SQL используется целочисленное деление, которое дает 0. Это будет работать:

DECLARE @countRatio decimal(6,3)      
SET @countRatio = (((2.0)/(4.0))*(6))/100.0 
0 голосов
/ 30 марта 2012
declare @countRatio decimal(6,3)      

-- Using integers 2 / 4 = 0:
set @countRatio = ( ( 2 / 4 ) * 6 ) / 100.0
select @countRatio

-- Using decimal values 2 / 4 = 0.5:
set @countRatio = ( ( 2. / 4. ) * 6. ) / 100.0
select @countRatio

-- Explicitly converting a value to decimal will cause the other values to be promoted to decimal:
set @countRatio = ( ( Cast( 2 as Decimal ) / 4 ) * 6 ) / 100.0 -- Decimals.
select @countRatio

-- Or:
set @countRatio = ( ( Convert( Decimal, 2 ) / 4 ) * 6 ) / 100.0 -- Decimals.
select @countRatio

-- The promotion occurs when it is needed.  Hence this doesn't do what you want:
set @countRatio = ( ( 2 / 4 ) * Convert( Decimal, 6 ) ) / 100.0 -- Decimals.
select @countRatio
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...