• The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
Menu
  • The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
  • Odd Ways to Round Numbers

    September 21, 2005 Hey, Ted

    SQL’s ROUND function allows me to round to the nearest whole number. How can I round to the nearest half?

    –Chad

    The ROUND function accepts two arguments–a number to be rounded and the number of decimal positions to round to. If the second argument is zero, the first argument is rounded to a whole number. If the second argument is positive, the number is rounded right of the decimal point (i.e., to tenths, hundredths, thousandths, etc). If the second argument is negative, the first number is rounded left of the decimal point (to tens, hundreds, thousands, etc).

    The following example illustrates the ROUND function. A number is rounded to hundredths (two decimal positions), tenths (one decimal position), a whole number, tens, and hundreds.

    select number,
           round(number,2), round(number,1),
           round(number,0),
           round(number,-1), round(number,-2)
      from mydata
    

    Number    Round 2   Round 1   Round 0   Round -1  Round -2
    878.787-  878.790-  878.800-  879.000-  880.000-  900.000-
    434.343-  434.340-  434.300-  434.000-  430.000-  400.000-
       .000      .000      .000      .000      .000      .000
    212.121   212.120   212.100   212.000   210.000   200.000
    656.565   656.570   656.600   657.000   660.000   700.000
    

    Now, to the question at hand. If you want to round to a fraction, you’ll have to do a little easy math. There are only three steps.

    1. Multiply the number by the reciprocal of the fraction.

    2. Round to a whole number.

    3. Divide by the reciprocal of the fraction.

    The following example rounds a set of numbers to the nearest quarter and the nearest half.

    select number,                                          
           dec(round(number * 2, 0)/2,11,1) as Nearest_Half,
           dec(round(number * 4, 0)/4,11,2) as Nearest_Qtr  
     from mydata 
    

    Number  Nearest Half   Nearest Qtr
      .00        .0           .00
     1.00       1.0          1.00
     1.10       1.0          1.00
     1.12       1.0          1.00
     1.13       1.0          1.25
     1.20       1.0          1.25
     1.25       1.5          1.25
     1.30       1.5          1.25
     1.37       1.5          1.25
     1.38       1.5          1.50
     1.40       1.5          1.50
     1.45       1.5          1.50
     1.50       1.5          1.50
     1.60       1.5          1.50
     1.62       1.5          1.50
     1.63       1.5          1.75
     1.70       1.5          1.75
     1.75       2.0          1.75
     1.80       2.0          1.75
     1.82       2.0          1.75
     1.83       2.0          1.75
     1.90       2.0          2.00
     2.00       2.0          2.00
    

    This technique works for fractions with numerators other than one. Here’s a query that rounds to the nearest three-quarters.

    select number,                                                    
           dec(round(number * 1.3333, 0)/1.3333,11,2) as Nearest_3qtrs
     from mydata
    

    Number    Nearest 3Qtrs
      .000              .00
      .300              .00
      .400              .75
      .500              .75
      .700              .75
      .900              .75
     1.000              .75
     1.100              .75
     1.200             1.50
     1.300             1.50
     1.400             1.50
     1.500             1.50
     1.600             1.50
     1.700             1.50
     1.800             1.50
     1.900             2.25
     2.000             2.25
     2.100             2.25
     2.200             2.25
     2.300             2.25
     2.400             2.25
    

    I don’t know how useful rounding to such a fraction is, so I won’t charge you extra for that information.

    You can also round to multiples of a number. The steps are like those for fractions, but the math is easier if you reverse the multiplication and division operations.

    1. Divide the number to be rounded by the number to which you’re rounding.

    2. Round to a whole number.

    3. Multiply by the number to which you’re rounding.


    The following query rounds to the nearest 25 and nearest 50.

     select number,                                           
           dec(round(number / 25, 0)*25,11,0) as Nearest_25, 
           dec(round(number / 50, 0)*50,11,0) as Nearest_50  
     from mydata
    

    Number     Nearest 25       Nearest 50
       0                0                0
     100              100              100
     110              100              100
     112              100              100
     113              125              100
     120              125              100
     125              125              150
     130              125              150
     137              125              150
     138              150              150
     140              150              150
     145              150              150
     150              150              150
     160              150              150
     162              150              150
     163              175              150
     170              175              150
     175              175              200
     180              175              200
     182              175              200
     183              175              200
     190              200              200
     200              200              200
    

    SQL has two other rounding-like functions–CEILING (or CEIL) and FLOOR. CEILING returns the smallest integer that is greater than or equal to the numeric argument. FLOOR returns the largest integer less than or equal to the numeric argument. One common use of FLOOR is to truncate digits right of the decimal point, but TRUNCATE (or TRUNC) is better for that task because it works for negative numbers. TRUNCATE accepts the same arguments that ROUND accepts.

    select number, round(number,0),
           floor(number), ceiling(number),
           dec(trunc(number,0),3,0)
      from mydata
    

    Number      Round    Floor    Ceil    Trunc
    878.787-      879-     879-    878-     878-
    555.000-      555-     555-    555-     555-
    434.343-      434-     435-    434-     434-
       .000         0        0       0        0
    212.121       212      212     213      212
    444.000       444      444     444      444
    656.565       657      656     657      656
    

    –Ted

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Tags:

    Sponsored by
    Midrange Dynamics North America

    Want to deliver DevOps on IBM i?

    DevOps enables your IBM i development teams to shorten the software development lifecycle while delivering features, fixes, and frequent updates that are closely aligned with business objectives. Flexible configuration options within MDChange make it easy to adapt to new workflow strategies and policies as you adopt DevOps practices across your organization.

    Learn More.

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Red Oak Rides Eclipse to Application Integration Party Quadrant Unveils IntelliChief for Paperless Process Management

    Leave a Reply Cancel reply

Volume 5, Number 35 -- September 21, 2005
THIS ISSUE
SPONSORED BY:

WorksRight Software
iTera
Twin Data

Table of Contents

  • When There’s No Room for Special Values
  • Odd Ways to Round Numbers
  • Admin Alert: A Checklist for Creating OS/400 User Profiles, Part II

Content archive

  • The Four Hundred
  • Four Hundred Stuff
  • Four Hundred Guru

Recent Posts

  • The Power11 Transistor Count Discrepancies Explained – Sort Of
  • Is Your IBM i HA/DR Actually Tested – Or Just Installed?
  • Big Blue Delivers IBM i Customer Requests In ACS Update
  • New DbToo SDK Hooks RPG And Db2 For i To External Services
  • IBM i PTF Guide, Volume 27, Number 33
  • Tool Aims To Streamline Git Integration For Old School IBM i Devs
  • IBM To Add Full System Replication And FlashCopy To PowerHA
  • Guru: Decoding Base64 ASCII
  • The Price Tweaking Continues For Power Systems
  • IBM i PTF Guide, Volume 27, Numbers 31 And 32

Subscribe

To get news from IT Jungle sent to your inbox every week, subscribe to our newsletter.

Pages

  • About Us
  • Contact
  • Contributors
  • Four Hundred Monitor
  • IBM i PTF Guide
  • Media Kit
  • Subscribe

Search

Copyright © 2025 IT Jungle