Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / что за баг? / 25 сообщений из 38, страница 1 из 2
15.02.2018, 16:07
    #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
15.02.2018, 16:16
    #39602471
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за баг?
...
Рейтинг: 0 / 0
15.02.2018, 16:28
    #39602482
что за баг?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за баг?
А можно подробнее?
я причину так и не понял
...
Рейтинг: 0 / 0
15.02.2018, 16:33
    #39602490
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за баг?
что за баг?,

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

А oracle, кстати, этот кейс считает правильно.
Привет микрософту :)
...
Рейтинг: 0 / 0
15.02.2018, 17:31
    #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
15.02.2018, 17:36
    #39602540
что за баг?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за баг?
a_voronin

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

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

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

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

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

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

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

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

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

помедитируйте теперь вы, у вас есть есть ERP-система и субд от одного разработчика, которая, криво работает. От того, что микрософт задокументировала свой алгоритм ее же erp ровнее работать не будет.Тогда раз у вас претензия к некоторой ERP-системе от MS, может быть вы обратитесь в ее службу поддержки?
...
Рейтинг: 0 / 0
15.02.2018, 18:02
    #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
15.02.2018, 18:11
    #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
15.02.2018, 18:15
    #39602583
что за баг?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за баг?
Гавриленко Сергей АлексеевичТогда раз у вас претензия к некоторой ERP-системе от MS, может быть вы обратитесь в ее службу поддержки?

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

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

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

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


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

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


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

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

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

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


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