Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 это глюк ? select (878.75/(878.75+231.25))* 741.00 = 586.62499950600  [new]
zulus
Guest
приветствую!
фокспро(set decimals to 18) и калькулятор дают 586.625 а sql server 586.62499950600 а очень хочется получить тоже самое до 2-го знака.
sql server round(586.62499950600,2) = 586.62
fox round(586.625,2) = 586.63
спасибо.
9 фев 03, 08:29    [125093]     Ответить | Цитировать Сообщить модератору
 Re: это глюк ? select (878.75/(878.75+231.25))* 741.00 = 586.62499950600  [new]
Серегей
Guest
попробуй (round(round(value,3)),2),
насклько я помню, это проблема записи данных типа float и их округления.
правда я не проверял (пока нет возможности), но по-моему так.
9 фев 03, 09:59    [125098]     Ответить | Цитировать Сообщить модератору
 Re: это глюк ? select (878.75/(878.75+231.25))* 741.00 = 586.62499950600  [new]
zulus
Guest
proboval, eto budet 586.63, to chto nado. Odnako eto portit resultaty dla ostalnix strok v tablitse. Pochemu vse krome sql servera govorjat cto eto ravno 586.625?
9 фев 03, 18:29    [125169]     Ответить | Цитировать Сообщить модератору
 Re: это глюк ? select (878.75/(878.75+231.25))* 741.00 = 586.62499950600  [new]
VAT
Member

Откуда: Нижний Новгород
Сообщений: 295
Да, прикольно. Если поменять умножение и деление, будет как надо - 586.62500000000
select 878.75* 741.00/(878.75+231.25)
9 фев 03, 18:45    [125171]     Ответить | Цитировать Сообщить модератору
 Re: это глюк ? select (878.75/(878.75+231.25))* 741.00 = 586.62499950600  [new]
zulus
Guest
spasibo VAT !
10 фев 03, 18:56    [125895]     Ответить | Цитировать Сообщить модератору
 Re: это глюк ? select (878.75/(878.75+231.25))* 741.00 = 586.62499950600  [new]
Crip
Member

Откуда:
Сообщений: 2490
Не надо злоупотреблять типом float и неявным преобразованием
типов
select cast((878.75/(878.75+231.25))* 741.00 as numeric(20,5))

-----------------

586.62500
11 фев 03, 10:35    [126147]     Ответить | Цитировать Сообщить модератору
 Re: это глюк ? select (878.75/(878.75+231.25))* 741.00 = 586.62499950600  [new]
Glory
Member

Откуда:
Сообщений: 104760
2zulus
Если вам интересно, что сервер делает с вашими числами, то

select SQL_VARIANT_PROPERTY (878.75, 'Precision'), SQL_VARIANT_PROPERTY (878.75, 'Scale')

union all
select SQL_VARIANT_PROPERTY ((878.75+231.25), 'Precision'), SQL_VARIANT_PROPERTY ((878.75+231.25), 'Scale')
union all
select SQL_VARIANT_PROPERTY ((878.75/(878.75+231.25)), 'Precision'), SQL_VARIANT_PROPERTY ((878.75/(878.75+231.25)), 'Scale')
union all
select SQL_VARIANT_PROPERTY ((878.75/(878.75+231.25))* 741.00, 'Precision'), SQL_VARIANT_PROPERTY ((878.75/(878.75+231.25))* 741.00, 'Scale')
-------------------------

numeric 5 2
numeric 6 2
numeric 14 9
numeric 20 11

Сервер просто пытается получить результат с наибольшей возможной точностью.

2VAT
Да, прикольно. Если поменять умножение и деление,
Операции с приблизительными числами не ассоциативны, т.к. при перестановке опрандов может нарушится и последовательность округления.

Довольно популярно это объяснено здесь (Примечание - MS SQL использует для округления метод round up)
11 фев 03, 14:58    [126471]     Ответить | Цитировать Сообщить модератору
 Re: это глюк ? select (878.75/(878.75+231.25))* 741.00 = 586.62499950600  [new]
zulus
Guest
2All
Vsem spasibo,

2Crip
is etogo sleduet, nado VSEGDA isplozovat cast pri vichislenii? V protivnom sluchae server so svoim jelaniem "poluchit maksimmalno tochny resultat" mojet nalomat drov.
11 фев 03, 23:36    [126837]     Ответить | Цитировать Сообщить модератору
 Re: это глюк ? select (878.75/(878.75+231.25))* 741.00 = 586.62499950600  [new]
Crip
Member

Откуда:
Сообщений: 2490
Вполне нормальное поведение. Он же не знает, что от него хотят.
Тот же "очень умный" фокспро может быть и делает неявные преобразования как может показаться более аккуратно, но к примеру в случае когда точно не задана длина выражения может сделать по результату первой записи.
Что-типа IIF(MyColumn = 0 ,0,(878.75/(878.75+231.25))* 741.00) , в случае первого значения MyColumn = 0 создаcт колонку с numeric(1), Когда как SQL Server в соответствующем CASE все равно numeric(20,11)...
Вот так вот
12 фев 03, 10:04    [126985]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить