Проблема округления SQL Server - PullRequest
0 голосов
/ 10 октября 2011

Я использую SQL Server 2005. И я использую функцию ROUND T-SQL для округления значения десятичного столбца.Но кажется, что округленное значение неверно.

    PRINT ROUND(1890.124854, 2) => 1890.120000

Как показано, функция ROUND возвращает 1890.12, где, как и должно быть, 1890.13.Кто-нибудь сталкивался с этим и каким должен быть правильный способ округления, чтобы я получил ожидаемое значение 1890.13 ..?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 10 октября 2011

ROUND() работает так, как предполагалось.Вы указали округление до 2 знаков после запятой, и это то, что вы получили.

Возвращает числовое значение, округленное до указанной длины или точности.

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

, поэтому

PRINT ROUND(1890.125000, 2) 

производит 1890.130000

Принимая во внимание

PRINT ROUND(1890.124999, 2) 

производит 1890.120000

2 голосов
/ 20 октября 2012

Ваша проблема округления связана с алгоритмом округления, используемым SQL Server.Я полагаю, что SQL Server использует алгоритм «округления до четности» (иногда называемый округлением Банкира).При округлении банкира цифра округляется в меньшую сторону, если младшая цифра справа от нее меньше пяти, или округляется в большую сторону, если младшая цифра справа от нее больше пяти.Если младшая значащая цифра справа от нее равна пяти, то цифра слева от пяти округляется до ближайшего четного числа.

В вашем примере 1890.124854, поскольку округление начинается ссамая правая цифра и работает слева, 8 заставляет 4 слева от него округляться до 5. У пятерки слева есть четное число (2), поэтому, так как оно уже четное, онооставляет это в покое.Таким образом, округление до двух знаков после запятой должно дать 1890.12.Однако, если ваш пример был 1890.134854, то, как округление работает справа налево, 8 округляет 4 до 5, а затем 3 рядом с 5 округляется до следующего четного числа, равного 4. Результатокругление до двух знаков после запятой должно привести к 1890,14.

Теория состоит в том, что 1890,125 не ближе ни к 1890,12, ни к 1890,13.Это точно между.Следовательно, всегда округлять каждую цифру слева от 5 будет нежелательное смещение вверх, которое может искажать вычисления в сторону искусственно высокого результата.Это смещение вверх становится более преувеличенным в сложных вычислениях или в тех, которые включают в себя несколько итераций, где цифра пять как наименее значимая цифра может встречаться много раз.Тем не менее, в общих расчетах число слева от 5 статистически так же вероятно, будет четным и нечетным.Из-за этого округление до четного числа приводит к тому, что вычисление статистически приближается к истинному среднему значению округленного числа.

Более того, почти все используют этот алгоритм "округления до четности".Много лет назад я развивался на языке программирования, который этого не делал.В нем использовалось более «традиционное» округление, когда все слева от 5 округлялось, независимо от того, является ли оно четным или нечетным.Мы столкнулись с проблемой смещения, о которой я упоминал выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...