2013-06-27 3 views
3

Может ли кто-нибудь помочь решить следующую проблему округления. Заранее спасибоПроблема округления в запросе SQL Server R2 R2

У меня есть номер: 3,1050 Требовать Выход: 3,10 , но когда я использую ROUND (3.1050,2) я получаю результат 3,11, следовательно, я не могу использовать ROUND там .. Ниже приведены некоторые случаи, которые помогают вы решить мой вопрос

Если значение: 3,1030 Требовать выход: 3,10 Если значение: 3,1050 Требовать выход: 3,10 Если значение: 3,1080 Требовать выход: 3,11

+0

Я думаю, что вы хотите [ "банкиры округление "] (http://blogs.msdn.com/b/ericlippert/archive/2003/09/26/bankers-rounding.aspx)/[" round half to even "] (http: //en.wikipedia. org/wiki/Rounding # Round_half_to_even) в T-SQL. Самый эффективный подход - использовать функцию .NET 'Math.Round' как [CLR-функцию] (http://msdn.microsoft.com/en-us/library/ms189876.aspx). –

+1

@TimSchmelter * Я думаю, что вы хотите, чтобы пекари округлились в T-SQL. * Ммм ... округление бакера ... –

+0

Да, но я должен сделать это по запросу SQL Server не на .NET. – user2493287

ответ

7

Что вам нужно, это Round Half Towards Zero метод округления, который SQL Server не предоставляет внутренне; Функция ROUND() SQL Server всегда следует «Round away from zero» с дополнительным параметром для усечения вместо округления.

Поэтому просто написать пользовательскую функцию, которая использует функцию Round() вокруг края случае последней цифры являющейся 5 с последующим нулями:

Create Function dbo.RoundToZero(@Val Decimal(32,16), @Digits Int) 
Returns Decimal(32,16) 
AS 
Begin 
    Return Case When Abs(@Val - Round(@Val, @Digits, 1)) * Power(10, @Digits+1) = 5 
       Then Round(@Val, @Digits, 1) 
       Else Round(@Val, @Digits) 
       End 
End 

Источник: SQL Server Rounding Methods