1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Ceil/Floor/Round in Perl

Discussion in 'Perl' started by pradeep, Aug 25, 2009.

  1. pradeep

    pradeep Team Leader

    Joined:
    Apr 4, 2005
    Messages:
    1,646
    Likes Received:
    86
    Trophy Points:
    0
    Occupation:
    Programmer
    Location:
    Kolkata, India
    Home Page:

    Ceil in Perl



    Cieling is basically outputing the next largest integer for an given real number.
    Code:
    ceiling(x) is the smallest integer not less than x
    Ways to do it in Perl, a) using our own logic

    Code:
    my $num = 45.4;
    my $ceil = int($num + 0.99);
    
    b) using POSIX

    Code:
    use POSIX qw/ceil/;
    
    my $num = 45.4;
    my $ceil = ceil($num);
    

    Floor in Perl



    Flooring is outputing the next smallest integer for an given real number.
    Code:
    floor(x) is the largest integer not greater than x
    Ways to do it in Perl, a) using our own logic

    Code:
    my $num = 45.4;
    my $floor = int($num);
    
    b) using POSIX

    Code:
    use POSIX qw/floor/;
    
    my $num = 45.4;
    my $floor = floor($num);
    

    Round in perl



    Rounding is converting any floating-point number to the nearest integer.

    Ways to do it in Perl, a) using our own logic

    Code:
    my $num = 45.4;
    my $round = int($num + 0.5);
    
    b) using Math::Round

    Code:
     use Math::Round qw/round/;
    
    my $num = 45.4;
    my $round = round($num);
    
    It'll be really nice if everyone crontributes to this thread with the equivalent functions in the language they are comfortable with.
     
    shabbir likes this.
  2. asha

    asha New Member

    Joined:
    Nov 9, 2006
    Messages:
    44
    Likes Received:
    2
    Trophy Points:
    0
    Occupation:
    Homemaker
    Location:
    Kolkata
    Home Page:
    Really nice, but the methods using modules is much more reliable I guess.
     
  3. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,283
    Likes Received:
    364
    Trophy Points:
    83
  4. sorin25

    sorin25 New Member

    Joined:
    Jan 3, 2011
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    God dam, how the fuck are you morons still alive ?

    PHP:
    use POSIX qw/ceil/;
    sub idiot_ceil { return int($_[0] + 0.99) }

    for 
    $i qw/0.0005 -1.4 4.00005/) {
         
    local $,="\t"local $\="\n";
         print 
    $iidiot_ceil($i), ceil($i), (idiot_ceil($i) != ceil($i)) ? " yet again, you are a moron" ".. you got this right genius";
    }
    If you morons have trouble running this, this is the output:
    Code:
    0.0005    0    1     yet again, you are a moron
    -1.4    0    -1     yet again, you are a moron
    4.00005    4    5     yet again, you are a moron
    
    Fuck, and this is a top Google result. Stop publishing this crap before you infect the rest of the planet with your idiocy!
     
  5. stardakev

    stardakev New Member

    Joined:
    Jan 9, 2015
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    When I don't want the overhead of the full Posix module to implement only the Ceil function, I use this implementation.

    Usage $Result = &Ceil ($Original_Number, $Ceil_Value);

    $Ceil_Value can be any positive, non zero integer.

    Examples
    If rounding up to the nearest dollar $Ceil_Value = 1

    If rounding up to the nearest 5 cents $Ceil_Value = 0.05

    Note, there is no error trapping.

    Code:
     
    sub Ceil {
    
    	my $x = shift;
    
    	my $r = shift;
    
    	my $Len = &decLen($x);
    
    	my $rLen = &decLen($r);
    
    	$Len = $rLen if $rLen > $Len;
    
    	$x = $x * 10**$Len;
    
    	$r = $r * 10**$Len;
    
    	my $ceil = ($x + ((-$x) % $r)) / 10**$Len;
    
    	return $ceil;
    }
    
    sub decLen {    #returns how many digits after the decimal point
    
    	my ($a, $c) = ($_[0] =~ /(\d*).(\d*)/);
    
    	return length $c
    }
    
     
  6. stardakev

    stardakev New Member

    Joined:
    Jan 9, 2015
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    My bad

    I meant $Ceil_Value can be any positive, non zero value.
     

Share This Page