powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / что за баг?
38 сообщений из 38, показаны все 2 страниц
что за баг?
    #39602465
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)

правильный результат во втором.
Кто может объяснить?
...
Рейтинг: 0 / 0
что за баг?
    #39602471
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
что за баг?
    #39602482
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно подробнее?
я причину так и не понял
...
Рейтинг: 0 / 0
что за баг?
    #39602490
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за баг?,

подробней чем там некуда уже
NUMERIC(15,10)
...
Рейтинг: 0 / 0
что за баг?
    #39602492
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну или медитируйте над фразой

автор* 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.
...
Рейтинг: 0 / 0
что за баг?
    #39602534
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, остается только медитировать :)
Microsoft Dynamics AX имеет всего один числовой тип данных в sql sever - NUMERIC(32,16).
Просто круть.

А oracle, кстати, этот кейс считает правильно.
Привет микрософту :)
...
Рейтинг: 0 / 0
что за баг?
    #39602536
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за баг?,

Привет скорее тебе. Вот выполни
Код: sql
1.
2.
3.
DECLARE @price FLOAT(32) = 12599
DECLARE @discount FLOAT(32) = 7
SELECT ((@price - ROUND(@price * (1.0- @discount/100.0),0.0)) /@price * 100.0) 
...
Рейтинг: 0 / 0
что за баг?
    #39602540
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin

и что?
...
Рейтинг: 0 / 0
что за баг?
    #39602541
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

а что изменится?
...
Рейтинг: 0 / 0
что за баг?
    #39602545
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
c FLOAT правильно работает
хоть с FLOAT(1) хоть с FLOAT(53)

криво работает именно с NUMERIC
...
Рейтинг: 0 / 0
что за баг?
    #39602547
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за баг?c FLOAT правильно работает
хоть с FLOAT(1) хоть с FLOAT(53)

криво работает именно с NUMERIC
это только вам так кажется
...
Рейтинг: 0 / 0
что за баг?
    #39602556
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKчто за баг?c FLOAT правильно работает
хоть с FLOAT(1) хоть с FLOAT(53)

криво работает именно с NUMERIC
это только вам так кажется

помедитируйте теперь вы, у вас есть есть ERP-система и субд от одного разработчика, которая, криво работает. От того, что микрософт задокументировала свой алгоритм ее же erp ровнее работать не будет.
...
Рейтинг: 0 / 0
что за баг?
    #39602560
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за баг?TaPaKпропущено...

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

помедитируйте теперь вы, у вас есть есть ERP-система и субд от одного разработчика, которая, криво работает. От того, что микрософт задокументировала свой алгоритм ее же erp ровнее работать не будет.
какой алгоритм? вам надо какая точность надо
...
Рейтинг: 0 / 0
что за баг?
    #39602565
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за баг?TaPaKпропущено...

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

помедитируйте теперь вы, у вас есть есть ERP-система и субд от одного разработчика, которая, криво работает. От того, что микрософт задокументировала свой алгоритм ее же erp ровнее работать не будет.Тогда раз у вас претензия к некоторой ERP-системе от MS, может быть вы обратитесь в ее службу поддержки?
...
Рейтинг: 0 / 0
что за баг?
    #39602573
dgyuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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
...
Рейтинг: 0 / 0
что за баг?
    #39602581
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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, с подобным типом данных, цифра получается одинаковая и не такая.
...
Рейтинг: 0 / 0
что за баг?
    #39602583
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей АлексеевичТогда раз у вас претензия к некоторой ERP-системе от MS, может быть вы обратитесь в ее службу поддержки?

Может быть.
...
Рейтинг: 0 / 0
что за баг?
    #39602585
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за баг?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))
...
Рейтинг: 0 / 0
что за баг?
    #39602593
что за баг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKдля и ндусов всегда так

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

лучше бы индусы не писали ни sql server, ни erp, но в любом случае еще один жирный минус sql server
...
Рейтинг: 0 / 0
что за баг?
    #39602597
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за багTaPaKдля и ндусов всегда так

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


лучше бы индусы не писали ни sql server, ни erp, но в любом случае еще один жирный минус sql server
обидели мышку
...
Рейтинг: 0 / 0
что за баг?
    #39602610
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за баг?А oracle, кстати, этот кейс считает правильно.
Привет микрософту :)А диапазоны numeric(decimal) на Oracle и MSSQL не пытались сравнить, прежде чем ярлыки лепить?
...
Рейтинг: 0 / 0
что за баг?
    #39602617
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)

Вы имеете ввиду, что там тоже возможны подобные кейсы?
...
Рейтинг: 0 / 0
что за баг?
    #39602618
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за багTaPaKдля и ндусов всегда так

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


лучше бы индусы не писали ни sql server, ни erp, но в любом случае еще один жирный минус sql serverНе используйте MSSQL, делов-то.
...
Рейтинг: 0 / 0
что за баг?
    #39602626
что за баг,

я бы не стал так ратовать за оракл с его неявными преобразованиями типов. так-то оно тоже иногда доставляет проблем "на ровном месте". просто нужно учитывать специфику каждой СУБД и подстраивать свои решения под неё...
...
Рейтинг: 0 / 0
что за баг?
    #39602658
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эхчто за баг,

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

согласен, найду такой баг в оракле - поставлю жирный минус ораклу.
Странно, что всех это устраивает...
...
Рейтинг: 0 / 0
что за баг?
    #39602662
bideveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot что за баг?]Добрый Э - Эхсогласен, найду такой баг в оракле - поставлю жирный минус ораклу.
Странно, что всех это устраивает...
А как в оракле сейчас? А какой должен быть правильный алгоритм, чтобы всех устраивало?
...
Рейтинг: 0 / 0
что за баг?
    #39602664
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot bideveloper]что за баг?пропущено...

А как в оракле сейчас? А какой должен быть правильный алгоритм, чтобы всех устраивало?

Этот кейс в оракле правильно отработал.

В этом кейсе надо было 5-й знак хотя бы округлить, а не усекать. Уже было бы точнее.
...
Рейтинг: 0 / 0
что за баг?
    #39602671
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевиччто за баг?пропущено...


помедитируйте теперь вы, у вас есть есть ERP-система и субд от одного разработчика, которая, криво работает. От того, что микрософт задокументировала свой алгоритм ее же erp ровнее работать не будет.Тогда раз у вас претензия к некоторой ERP-системе от MS, может быть вы обратитесь в ее службу поддержки?Эта ERP-система вообще то сама общается с SQL Server, имеет свой собственный язык и не подразумевает чтобы кто-то лез напрямую в базу. Я думаю именно это в поддержке и скажут.
...
Рейтинг: 0 / 0
что за баг?
    #39603045
Попробуйте сначала умножить на 100, а потом уже разделить на @price, т.е.

Код: sql
1.
2.
3.
4.
DECLARE @price NUMERIC(32,16) = 12599
DECLARE @discount NUMERIC(32,16) = 7
SELECT ((@price - ROUND(@price * (1- @discount/100),0)) * 100 / @price ) 
GO
...
Рейтинг: 0 / 0
что за баг?
    #39603055
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин К.,

21194846
...
Рейтинг: 0 / 0
что за баг?
    #39603064
TaPaK,

Упс, не заметил
...
Рейтинг: 0 / 0
что за баг?
    #39603216
что за баг?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валентин К.Попробуйте сначала умножить на 100, а потом уже разделить на @price, т.е.
[/src]

Проблема не в том, как решить этот кейс, а в том, что в данном вопросе аксапта генерит сама sql-код и еще только с одним числовым типом. и такая лажа может выстрелить в любой момент. как у нас.
...
Рейтинг: 0 / 0
что за баг?
    #39603224
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за баг?Валентин К.Попробуйте сначала умножить на 100, а потом уже разделить на @price, т.е.
[/src]

Проблема не в том, как решить этот кейс, а в том, что в данном вопросе аксапта генерит сама sql-код и еще только с одним числовым типом. и такая лажа может выстрелить в любой момент. как у нас.
давйте спрашивать при чём же здесь SQL Server? И абсолютно не факт что васм здесь скажут про правильную реализацию в Microsoft Dynamics AX, спрашивайте у поддержки/профильных форумах, 90% того что вы не умеете его готовить, но уже смело кричите что Д`артанья не здесь
...
Рейтинг: 0 / 0
что за баг?
    #39603250
dgyuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если здесь трактовать constant, как любое отдельно взятое значение...

https://technet.microsoft.com/en-us/library/ms191530(v=sql.105).aspx

Converting decimal and numeric Data
For the decimal and numeric data types, SQL Server considers each specific combination of precision and scale as a different data type. For example, decimal(5,5) and decimal(5,0) are considered different data types.

In Transact-SQL statements, a constant with a decimal point is automatically converted into a numeric data value, using the minimum precision and scale necessary. For example, the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.
...
Рейтинг: 0 / 0
что за баг?
    #39603332
что за баг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot TaPaK]что за баг?пропущено...
давйте спрашивать при чём же здесь SQL Server? И абсолютно не факт что васм здесь скажут про правильную реализацию в Microsoft Dynamics AX, спрашивайте у поддержки/профильных форумах, 90% того что вы не умеете его готовить, но уже смело кричите что Д`артанья не здесь
Кого спрашивать? Здесь? на этом форуме? И для чего?

Я что хотел выяснил - могу повторить свое мнение: в этом кейсе криво работает сиквел и криво с сиквелом работает аксапта, но это только мое мнение.

Если вы считаете, что за этот кейс можно плюс серверу поставить (за такую потерю точности на ровном месте) - я же не против. Считайте, радуйтесь. Могло быть и хуже. Так можно и в идолы сиквел вознести, типа он во всех случаях всегда прав, он не может быть не правым, он просто такой, а кто не согласен - не используйте, как мне намекнули.

А вам спасибо, что помогли разобраться.
...
Рейтинг: 0 / 0
что за баг?
    #39604840
formfactor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL 2012
Видимо так работает тип NUMERIC - ему нужно явно указывать дробные числа.

Такое поведение раньше встречал и в других средах и языках программирования, не только в MS SQL.

SQL


Можно ещё вспомнить про ++i + ++i :)
...
Рейтинг: 0 / 0
что за баг?
    #39604844
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
formfactor,

а я разници не увидел
...
Рейтинг: 0 / 0
что за баг?
    #39604856
formfactor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Действительно, я затупил/запутался
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / что за баг?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]