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

Откуда: When your words mean nothing, I go la la la
Сообщений: 20581
Не буду рассказывать предысторию, суть в том что при делении больших чисел происходит усечение их в зависимости от ? размерности или еще чего.
version:
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2) (VM)
--ms sql 
select 11357485967.86452337379666561297981324 /31357485967.56541686879655139665426684 
--rezult: 0.362193

Почему это происходит?
Искал, но не нашел в хелпе описания подобного поведения. Оно нелогично. Это глюк или кто подскажет как работать с большими числами?

На всякий попробовал тоже в oracle.
-- oracle
select 11357485967.86452337379666561297981324 /31357485967.56541686879655139665426684 from dual;
-- rezult: 0,3621937670517377324457703557628565523183
10 дек 09, 21:44    [8049418]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить два числа? MS SQL выкидывает фортель  [new]
Glory
Member

Откуда:
Сообщений: 104760
select cast(11357485967.86452337379666561297981324 as float)/cast(31357485967.56541686879655139665426684 as float)
10 дек 09, 21:50    [8049449]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить два числа? MS SQL выкидывает фортель  [new]
In_Wait
Member [заблокирован]

Откуда: When your words mean nothing, I go la la la
Сообщений: 20581
select cast(11357485967.86452337379666561297981324 as float)/31357485967.56541686879655139665426684
---- получается: 0,362193767051738
это только 15 знаков :-(

Хотелось бы хотя бы 20.
select  cast(0.56452337379666561297 as float)/
        cast(0.82652913863245632373 as float)
--           0,683004805772129

тоже не дает 20. а хотелось бы еще запас.

И как бы причины такого поведения в чем, майкрософт какие нить пояснения дает?
10 дек 09, 22:16    [8049552]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить два числа? MS SQL выкидывает фортель  [new]
rancid
Member

Откуда: *мск
Сообщений: 114
BOL (локальная ссылка: ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.ru/s10de_6tsql/html/08ea66b7-624e-4d8b-86bc-750ff76cdfc5.htm) пишет так:

float [ ( n ) ]
Где n — это количество битов, используемых для хранения мантиссы числа в формате float при экспоненциальном представлении. Определяет точность данных и размер для хранения. Значение параметра n должно лежать в пределах от 1 до 53. Значением по умолчанию для параметра n является 53.

n Точность Объем памяти
1–24 7 знаков 4 байта

25–53 15 знаков 8 байт

Так что все правильно.. Попробуйте использовать тип decimal.
11 дек 09, 05:49    [8050196]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить два числа? MS SQL выкидывает фортель  [new]
In_Wait
Member [заблокирован]

Откуда: When your words mean nothing, I go la la la
Сообщений: 20581
rancid,

Что правильно? Что два числа с 20 знаками после запятой усекается ? В тз 20 знаков. Расчет страхового тарифа. Там коэф даются 18 знаков после запятой. Че терь на оракл переходить из за этого бага?
11 дек 09, 10:55    [8051187]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить два числа? MS SQL выкидывает фортель  [new]
Glory
Member

Откуда:
Сообщений: 104760
In_Wait
rancid,

Что правильно? Что два числа с 20 знаками после запятой усекается ? В тз 20 знаков. Расчет страхового тарифа. Там коэф даются 18 знаков после запятой. Че терь на оракл переходить из за этого бага?

Это не бага. Это правила, по которым MSSQL работает с десяичными числами. Они документированы в главе хелпа Precision, Scale, and Length
11 дек 09, 10:57    [8051207]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить два числа? MS SQL выкидывает фортель  [new]
rancid
Member

Откуда: *мск
Сообщений: 114
In_Wait,
так, наверное, при проектировании, следует продумать какие типы данных использовать? Для типа данных float все правильно.
11 дек 09, 11:10    [8051359]     Ответить | Цитировать Сообщить модератору
 Re: Как разделить два числа? MS SQL выкидывает фортель  [new]
In_Wait
Member [заблокирован]

Откуда: When your words mean nothing, I go la la la
Сообщений: 20581
Glory,
Вдумчиво вчитался в хелп. Посчитал. Надо подумать. Спасибо, видимо это место невнимательно прочел.
11 дек 09, 11:17    [8051459]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить