Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Преобразование типов при мат.операции  [new]
UniqueNick
Member

Откуда: Москва
Сообщений: 42
Что-то я не совсем понимаю, как именно происходит преобразование типов при математической операции:

declare @t table
(i integer not null)
insert into @t values (1)

declare @n numeric (30, 10)
select @n = 1235698.0123456789

select 
@n,
@n * 1,
mul = @n * i,
mul_num = @n * convert(numeric(30, 10), i)

from @t
Результат:
1235698.0123456789    1235698.0123456789    1235698.0123457    1235698.012346

Непонятно, как получились значения в третьем и четвёртом столбцах. Откуда взялась точность в 8 знаков после запятой в третьем столбце и в 7 - в четвёртом?
Интересно, что если длину всех numeric'ов заменить на 20 (т.е., сделать numeric (20, 10)), то разультат будет такой, какой и ожидается в 3-ем столбце, а в четвёртом точность поднимется аж до 17-ти знаков после запятой... Или длина numeric в 30 - это что-то "сверхъестественное"???

Спасибо

Microsoft SQL Server 2000 - 8.00.818 (Intel X86) May 31 2003 16:08:15 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
1 сен 05, 16:27    [1837664]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование типов при мат.операции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Если сделать так:

declare @t table
(i integer not null)
insert into @t values (1)

declare @n numeric (30, 10)
select @n = 1235698.0123456789

select 
@n A,
@n * 1 B,
@n * i C,
@n * convert(numeric(30, 10), i) D
INTO #TempTable
from @t

SELECT
  *
FROM
  #TempTable
SELECT
 name, xprec, xscale
FROM
  tempdb..syscolumns
WHERE
  id = OBJECT_ID('tempdb..#TempTable')
GO

DROP TABLE #TempTable

и вспомнить о:

This table defines how the precision and scale of the result are calculated when the result of an operation is of type decimal. The result is decimal when:

-Both expressions are decimal.
-One expression is decimal and the other is a data type with a lower precedence than decimal.

The operand expressions are denoted as expression e1, with precision p1 and scale s1, and expression e2, with precision p2 and scale s2. The precision and scale for any expression that is not decimal is the precision and scale defined for the data type of the expression.

OperationResult precisionResult scale *
e1 * e2p1 + p2 + 1s1 + s2


* The result precision and scale have an absolute maximum of 38. When a result precision is greater than 38, the corresponding scale is reduced to prevent the integral part of a result from being truncated.
1 сен 05, 17:28    [1838074]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование типов при мат.операции  [new]
Breakneck
Member

Откуда: Kiev
Сообщений: 2454
А сервак-то было бы неплохо поднять до СП3... :-)
1 сен 05, 18:51    [1838478]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование типов при мат.операции  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Breakneck
А сервак-то было бы неплохо поднять до СП3... :-)

8.00.818 - это SP3, и даже с последующим фиксом.
2 сен 05, 11:25    [1839894]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование типов при мат.операции  [new]
Breakneck
Member

Откуда: Kiev
Сообщений: 2454
GreenSunrise
Breakneck
А сервак-то было бы неплохо поднять до СП3... :-)

8.00.818 - это SP3, и даже с последующим фиксом.

Точно... что-то я маленько затупил, не увидев привычных 760 или 2039...
2 сен 05, 11:29    [1839909]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить