Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Почему так? (24*144/365 = 9.00000)  [new]
Vicont_rtf
Member

Откуда:
Сообщений: 64
Почему так?

declare @d numeric(12,5), @d1 numeric(12,5)
set @d = 24*144
set @d = @d/365
set @d1 = 24*144/365
select @d, @d1

Результат:

9.46849 9.00000
14 май 12, 11:00    [12548478]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Vicont_rtf, целочисленное деление
14 май 12, 11:08    [12548529]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
Добрый Э - Эх
Guest
потому что 24*144/365 - целочисленная арифметика (все операнды, учавствующие в выражении - целые числа)... Результат - тоже целое число.
А @d = 24*144 @d = @d/365 - операции над числами с плавающей точкой... Результат - число с плавающей точкой.
14 май 12, 11:10    [12548538]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Для понимания:
SELECT 1/2, 1./2
14 май 12, 11:11    [12548549]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
Добрый Э - Эх
Guest
Для примера, вот так попробуй:
cast(24 as numeric(12,5))*144/365

:-)
14 май 12, 11:12    [12548556]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
Vicont_rtf
Member

Откуда:
Сообщений: 64
Спасибо!

24*144/365.0 = 9.46849
14 май 12, 11:12    [12548560]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
Добрый Э - Эх
Guest
kDnZP,

блин, два раза опередил меня на кнопке :(
14 май 12, 11:13    [12548564]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Добрый Э - Эх, ну это жеж не соревнование, секунда больше, секунда меньше - роли не играет. Тем более, что вы больше букв писали.
14 май 12, 11:16    [12548591]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34703
Добрый Э - Эх
потому что 24*144/365 - целочисленная арифметика (все операнды, учавствующие в выражении - целые числа)... Результат - тоже целое число.
А @d = 24*144 @d = @d/365 - операции над числами с плавающей точкой... Результат - число с плавающей точкой.


Numeric число с фиксированной точкой, а не с плавающей, всё остальное верно.
14 май 12, 11:26    [12548667]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Из полезностей еще вот:
SELECT  1. / 2 RES
       ,SQL_VARIANT_PROPERTY(1. / 2, 'BaseType') BaseType
       ,SQL_VARIANT_PROPERTY(1. / 2, 'Precision') Precision
       ,SQL_VARIANT_PROPERTY(1. / 2, 'Scale') Scale
SELECT  1 / 2 RES
       ,SQL_VARIANT_PROPERTY(1 / 2, 'BaseType') BaseType
       ,SQL_VARIANT_PROPERTY(1 / 2, 'Precision') Precision
       ,SQL_VARIANT_PROPERTY(1 / 2, 'Scale') Scale
14 май 12, 11:34    [12548741]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
MyNiGoo
Member

Откуда:
Сообщений: 233
<offtop>
Добрый Э - Эх играет в ЧГК? :-)
</offtop>
14 май 12, 15:11    [12550662]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
Добрый Э - Эх
Guest
MyNiGoo
<offtop>
Добрый Э - Эх играет в ЧГК? :-)
</offtop>

Ну, тогда уж не ЧГК, а БР. ;)

Но нет, ни во что он не играет.
15 май 12, 06:01    [12553879]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
тоже не понимаю
Guest
select  SQL_VARIANT_PROPERTY(13 , 'scale') as scale_of_13,
		SQL_VARIANT_PROPERTY(cast(3 as numeric(8,0)) , 'scale') as scale_of_numeric_8_0,
		SQL_VARIANT_PROPERTY(cast(3 as numeric(8,0))/13 , 'scale') as scale_of_result,
		cast(3 as numeric(8,0))/13 as result


scale_of_13	scale_of_numeric_8_0	scale_of_result	          result
0 0 6 0.230769

вроде же вот деление целых чисел дает целое число.
а если у меня numeric(8,0), оно же целое? по крайней мере я явно указываю, что у меня scale = 0.
а откуда тогда при делении появляется scale = 6?
и можно ли как-то, не приводя к типу int, получить деление numeric на numeric без 6 знаков?
19 май 12, 16:08    [12581921]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
тоже не понимаю,

Precision, Scale, and Length
19 май 12, 16:10    [12581929]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
тоже не понимаю
Guest
pkarklin,
спасибо

e1 / e2

Result precision:
p1 - s1 + s2 + max(6, s1 + p2 + 1)

Result scale:
max(6, s1 + p2 + 1)

но откуда они взяли 6? почему 6-то???
19 май 12, 16:23    [12581948]     Ответить | Цитировать Сообщить модератору
 Re: Почему так? (24*144/365 = 9.00000)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
тоже не понимаю,

by design ((c) Microsoft)
19 май 12, 16:47    [12582012]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить