Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 что за баг?  [new]
что за баг?
Guest
sql server 2016, то же самое и на 2017

похоже на баг в первом варианте:

DECLARE @price NUMERIC(32,16) = 12599
DECLARE @discount NUMERIC(32,16) = 7
SELECT ((@price - ROUND(@price * (1- @discount/100),0)) /@price * 100)
GO
DECLARE @price FLOAT(32) = 12599
DECLARE @discount FLOAT(32) = 7
SELECT ((@price - ROUND(@price * (1- @discount/100),0)) /@price * 100)

правильный результат во втором.
Кто может объяснить?
15 фев 18, 16:07    [21194395]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
что за баг?,

https://technet.microsoft.com/en-us/library/ms190476(v=sql.110).aspx
15 фев 18, 16:16    [21194436]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг?
Guest
А можно подробнее?
я причину так и не понял
15 фев 18, 16:28    [21194484]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
что за баг?,

подробней чем там некуда уже
NUMERIC(15,10)
15 фев 18, 16:33    [21194509]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
ну или медитируйте над фразой

автор
* 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.
15 фев 18, 16:35    [21194514]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг?
Guest
спасибо, остается только медитировать :)
Microsoft Dynamics AX имеет всего один числовой тип данных в sql sever - NUMERIC(32,16).
Просто круть.

А oracle, кстати, этот кейс считает правильно.
Привет микрософту :)
15 фев 18, 17:27    [21194708]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4378
что за баг?,

Привет скорее тебе. Вот выполни
DECLARE @price FLOAT(32) = 12599
DECLARE @discount FLOAT(32) = 7
SELECT ((@price - ROUND(@price * (1.0- @discount/100.0),0.0)) /@price * 100.0) 
15 фев 18, 17:31    [21194721]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг?
Guest
a_voronin

и что?
15 фев 18, 17:36    [21194736]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
a_voronin,

а что изменится?
15 фев 18, 17:37    [21194738]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг?
Guest
c FLOAT правильно работает
хоть с FLOAT(1) хоть с FLOAT(53)

криво работает именно с NUMERIC
15 фев 18, 17:40    [21194746]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
что за баг?
c FLOAT правильно работает
хоть с FLOAT(1) хоть с FLOAT(53)

криво работает именно с NUMERIC

это только вам так кажется
15 фев 18, 17:42    [21194750]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг?
Guest
TaPaK
что за баг?
c FLOAT правильно работает
хоть с FLOAT(1) хоть с FLOAT(53)

криво работает именно с NUMERIC

это только вам так кажется


помедитируйте теперь вы, у вас есть есть ERP-система и субд от одного разработчика, которая, криво работает. От того, что микрософт задокументировала свой алгоритм ее же erp ровнее работать не будет.
15 фев 18, 17:51    [21194779]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
что за баг?
TaPaK
пропущено...

это только вам так кажется


помедитируйте теперь вы, у вас есть есть ERP-система и субд от одного разработчика, которая, криво работает. От того, что микрософт задокументировала свой алгоритм ее же erp ровнее работать не будет.

какой алгоритм? вам надо какая точность надо
15 фев 18, 17:54    [21194786]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
что за баг?
TaPaK
пропущено...

это только вам так кажется


помедитируйте теперь вы, у вас есть есть ERP-система и субд от одного разработчика, которая, криво работает. От того, что микрософт задокументировала свой алгоритм ее же erp ровнее работать не будет.
Тогда раз у вас претензия к некоторой ERP-системе от MS, может быть вы обратитесь в ее службу поддержки?
15 фев 18, 17:58    [21194798]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
dgyuk
Guest
DECLARE @price NUMERIC(38,28) = 12599
DECLARE @discount NUMERIC(38,28) = 7
DECLARE @tmp NUMERIC(38,28) = @price * (1.0- @discount/100.0)
SELECT @tmp
	,@price - ROUND(@tmp,0.0) 
	,@price 
	,SQL_VARIANT_PROPERTY(@price,'MaxLength')
	,SQL_VARIANT_PROPERTY(((@price - ROUND(@tmp,0.0))/@price),'MaxLength')
	,[разные]=(@price - ROUND(@tmp,0.0))/@price 
	,((@price - ROUND(@tmp,0.0)) /@price * 100.0) 
GO

DECLARE @price FLOAT(53) = 12599
DECLARE @discount FLOAT(53) = 7
DECLARE @tmp FLOAT(53) = @price * (1.0- @discount/100.0)
SELECT @tmp
	,@price - ROUND(@tmp,0.0) 
	,@price 
	,SQL_VARIANT_PROPERTY(@price,'MaxLength')
	,SQL_VARIANT_PROPERTY(((@price - ROUND(@tmp,0.0))/@price),'MaxLength')
	,[разные]=(@price - ROUND(@tmp,0.0))/@price 
	,((@price - ROUND(@tmp,0.0)) /@price * 100.0) 
GO
15 фев 18, 18:02    [21194809]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг?
Guest
TaPaK
какой алгоритм? вам надо какая точность надо


вот этот алгоритм, коорый усЁк точность на 4-ом знаке:

Операция Точность результата Масштаб результата *
e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 * e2 p1 + p2 + 1 s1 + s2
e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1)
e1 { UNION | EXCEPT | INTERSECT } e2 max(s1, s2) + max(p1-s1, p2-s2) max(s1, s2)
e1 % e2 min(p1-s1, p2 -s2) + max( s1,s2 ) max(s1, s2)

* Точность и масштаб результата имеют абсолютный максимум, равный 38. Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата.

----------

Я вам привел реальный кейс, когда манагеры с IT не могли понять в чем причина кривой цифры. на калькуляторе и на oracle, с подобным типом данных, цифра получается одинаковая и не такая.
15 фев 18, 18:11    [21194835]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг?
Guest
Гавриленко Сергей Алексеевич
Тогда раз у вас претензия к некоторой ERP-системе от MS, может быть вы обратитесь в ее службу поддержки?


Может быть.
15 фев 18, 18:15    [21194840]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
что за баг?
TaPaK
какой алгоритм? вам надо какая точность надо


вот этот алгоритм, коорый усЁк точность на 4-ом знаке:

Операция Точность результата Масштаб результата *
e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 * e2 p1 + p2 + 1 s1 + s2
e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1)
e1 { UNION | EXCEPT | INTERSECT } e2 max(s1, s2) + max(p1-s1, p2-s2) max(s1, s2)
e1 % e2 min(p1-s1, p2 -s2) + max( s1,s2 ) max(s1, s2)

* Точность и масштаб результата имеют абсолютный максимум, равный 38. Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата.

----------

Я вам привел реальный кейс, когда манагеры с IT не могли понять в чем причина кривой цифры. на калькуляторе и на oracle, с подобным типом данных, цифра получается одинаковая и не такая.

для и ндусов всегда так

автор
SELECT (100*CAST((@price - ROUND(@price * (1- @discount/100),0))as INT) /(@price))
15 фев 18, 18:16    [21194846]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг
Guest
TaPaK
для и ндусов всегда так

автор
SELECT (100*CAST((@price - ROUND(@price * (1- @discount/100),0))as INT) /(@price))


лучше бы индусы не писали ни sql server, ни erp, но в любом случае еще один жирный минус sql server
15 фев 18, 18:33    [21194867]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
что за баг
TaPaK
для и ндусов всегда так

пропущено...


лучше бы индусы не писали ни sql server, ни erp, но в любом случае еще один жирный минус sql server

обидели мышку
15 фев 18, 18:36    [21194877]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
что за баг?
А oracle, кстати, этот кейс считает правильно.
Привет микрософту :)
А диапазоны numeric(decimal) на Oracle и MSSQL не пытались сравнить, прежде чем ярлыки лепить?
15 фев 18, 18:46    [21194897]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг?
Guest
invm
что за баг?
А oracle, кстати, этот кейс считает правильно.
Привет микрософту :)
А диапазоны numeric(decimal) на Oracle и MSSQL не пытались сравнить, прежде чем ярлыки лепить?


NUMBER A decimal number with up to 38 significant digits in the range of -(10**125) to +(10**125)

Вы имеете ввиду, что там тоже возможны подобные кейсы?
15 фев 18, 19:01    [21194937]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
что за баг
TaPaK
для и ндусов всегда так

пропущено...


лучше бы индусы не писали ни sql server, ни erp, но в любом случае еще один жирный минус sql server
Не используйте MSSQL, делов-то.
15 фев 18, 19:03    [21194944]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
Добрый Э - Эх
Guest
что за баг,

я бы не стал так ратовать за оракл с его неявными преобразованиями типов. так-то оно тоже иногда доставляет проблем "на ровном месте". просто нужно учитывать специфику каждой СУБД и подстраивать свои решения под неё...
15 фев 18, 19:18    [21194982]     Ответить | Цитировать Сообщить модератору
 Re: что за баг?  [new]
что за баг?
Guest
Добрый Э - Эх
что за баг,

я бы не стал так ратовать за оракл с его неявными преобразованиями типов. так-то оно тоже иногда доставляет проблем "на ровном месте". просто нужно учитывать специфику каждой СУБД и подстраивать свои решения под неё...


согласен, найду такой баг в оракле - поставлю жирный минус ораклу.
Странно, что всех это устраивает...
15 фев 18, 20:49    [21195119]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить