Banker's Rounding

MS SQL Server has the Round function that rounds-off of mid-values (0.5, 5, 50, 500, etc.) up. Is there a function that will round-off mid-values according to Banker's Rounding, which will round of mid-values always to the even value? Anyone has one?
0.5->0
1.5->2
2.5->2
3.5->4
Thanks! :)
dabestprogrammerindauniverseAsked:
Who is Participating?
 
tomcat75Commented:
this is for Oracle
but for MSSQL  use the same logic (usinga i think CASE ...)

DECODE(VAR-ROUND(VAR,0),-0.5,DECODE(FLOOR(VAR)/2, FLOOR(FLOOR(VAR)/2),FLOOR(VAR),ROUND(VAR,0)),ROUND(VAR,0))

HTH
0
 
tomcat75Commented:
maybe an explanation will help

if
VAR-ROUND(VAR,0)=-0.5 (for 0.5 fractions)
if
FLOOR(VAR)/2=FLOOR(FLOOR(VAR)/2) --the number is even
then
FLOOR(VAR),
else
ROUND(VAR,0,
endif
ROUND(VAR,0)
endif


0
 
kemp_aCommented:
Hmm, funny, most MS development products used Bankers Rounding, some of the applications like Excel dont, but thats another story.

You can emulate Banker Rounding using the following formula:

round((Value*100-Half of the rounding value)/100)

eg

round(12.5*100-0.05)/100=12 or

Cheers
0
Improve Your Query Performance Tuning

In this FREE six-day email course, you'll learn from Janis Griffin, Database Performance Evangelist. She'll teach 12 steps that you can use to optimize your queries as much as possible and see measurable results in your work. Get started today!

 
xabimondCommented:
Encapsulated in a searched case:

declare @d as decimal(10,2)
set @d = 1.5
print @d

select (case when @d - round(@d, 0) <> -.5 then round(@d, 0)
      when (convert(int, floor(@d)) % 2) = 0 then floor(@d)
      else ceiling(@d)
      end) banker_rounded_number

Replace @d with your field name if appropriate.
0
 
dabestprogrammerindauniverseAuthor Commented:
i will try your solutions out and will then award my points :)
thanks to everyone.
0
 
Alan WarrenApplications DeveloperCommented:
Hi dabestprogrammerindauniverse,

This function will round up or down to the degree you specify.

-- Round up to the the nearest cent
-- Set @Somevarmoney = dbo.RoundToNearest(@SomeVarmoney,.01,1)

-- Round down to the the nearest cent
-- Set @Somevarmoney = dbo.RoundToNearest(@SomeVarmoney,.01,0)


CREATE Function [dbo].[RoundToNearest] (@Amt decimal(38, 19), @RoundAmt decimal(38, 19), @Direction bit)
-- @Direction=1 for RoundUp, @Direction=0 for RoundDown
RETURNS decimal(38, 19) AS  
BEGIN
  RETURN (CASE WHEN CONVERT(BIGINT, @Amt/@RoundAmt)=@Amt/@RoundAmt THEN @Amt ELSE (CONVERT(BIGINT, @Amt/@RoundAmt)+@Direction)*@RoundAmt END)
END


Alan
0
 
kemp_aCommented:
May I ask the reason for this recommendation.

Not discounting alanwarren's solution, which appears in essence very similar to the three previously posted solutions albeit posted 25 days after those solutions, and indeed 11 days after the asker posted they would try the already proffered solutions.

I believe the point should be shared between Tomcat75, xabimond & myself as these were posted prior to the askers final post and indeed in good hast to the askers question.

I look forward to your reply.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.