Get ceiling integer from number in linux (BASH)

后端 未结 13 1957
陌清茗
陌清茗 2020-12-01 04:54

How would I do something like:

ceiling(N/500)

N representing a number.

But in a linux Bash script

相关标签:
13条回答
  • 2020-12-01 05:38

    Some more concise Awk logic

    awk '
    function ceil(ip) {
      print ip%1 ? int(ip)+1 : ip
    }  
    BEGIN {
      ceil(1000/500)
      ceil(1001/500)
    }
    '
    

    Result

    2
    3
    
    0 讨论(0)
  • 2020-12-01 05:40

    Why use external script languages? You get floor by default. To get ceil, do

    $ divide=8; by=3; (( result=(divide+by-1)/by )); echo $result
    3
    $ divide=9; by=3; (( result=(divide+by-1)/by )); echo $result
    3
    $ divide=10; by=3; (( result=(divide+by-1)/by )); echo $result
    4
    $ divide=11; by=3; (( result=(divide+by-1)/by )); echo $result
    4
    $ divide=12; by=3; (( result=(divide+by-1)/by )); echo $result
    4
    $ divide=13; by=3; (( result=(divide+by-1)/by )); echo $result
    5
    ....
    

    To take negative numbers into account you can beef it up a bit. Probably cleaner ways out there but for starters

    $ divide=-10; by=10; neg=; if [ $divide -lt 0 ]; then (( divide=-divide )); neg=1; fi; (( result=(divide+by-1)/by )); if [ $neg ]; then (( result=-result )); fi; echo $result
    -1
    
    $ divide=10; by=10; neg=; if [ $divide -lt 0 ]; then (( divide=-divide )); neg=1; fi; (( result=(divide+by-1)/by )); if [ $neg ]; then (( result=-result )); fi; echo $result
    1
    

    (Edited to switch let ... to (( ... )).)

    0 讨论(0)
  • 2020-12-01 05:40

    If you are already familiar with the Python library, then rather than learn bc, you might want to define this bash function:

    pc () { pyexpr="from math import *; print($@)"; python -c "$pyexpr"; }
    

    Then:

    pc "ceil(3/4)"
    1
    

    but also any valid python expression works:

    pc pi / 4
    0.7853981633974483
    
    pc "'\n'.join(['Pythagoras said that %3.2f^2 + %3.2f^2 is always %3.2f'
        % (sin(ai), cos(ai), sin(ai)**2 + cos(ai)**2)
        for ai in [pi / 4 * k for k in range(8)]])"
    Pythagoras said that 0.00^2 + 1.00^2 is always 1.00
    Pythagoras said that 0.71^2 + 0.71^2 is always 1.00
    Pythagoras said that 1.00^2 + 0.00^2 is always 1.00
    Pythagoras said that 0.71^2 + -0.71^2 is always 1.00
    Pythagoras said that 0.00^2 + -1.00^2 is always 1.00
    Pythagoras said that -0.71^2 + -0.71^2 is always 1.00
    Pythagoras said that -1.00^2 + -0.00^2 is always 1.00
    Pythagoras said that -0.71^2 + 0.71^2 is always 1.00
    
    0 讨论(0)
  • 2020-12-01 05:42

    Using the gorgeous 'printf' 1 will round up to the next integer

    printf %.0f $float
    or
    printf %.0f `your calculation formula`
    or
    printf %.0f $(your calculation formula)
    

    ref: how to remove decimal from a variable?

    0 讨论(0)
  • 2020-12-01 05:44
    Floor () {
      DIVIDEND=${1}
      DIVISOR=${2}
      RESULT=$(( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ))
      echo ${RESULT}
    }
    R=$( Floor 8 3 )
    echo ${R}
    

    Ceiling () {
      DIVIDEND=${1}
      DIVISOR=${2}
      $(( ( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ) + 1 ))
      echo ${RESULT}
    }
    R=$( Ceiling 8 3 )
    echo ${R}
    
    0 讨论(0)
  • 2020-12-01 05:53

    Without specifying any function, we can use the following awk script:

    echo x y | awk '{ r=$1 % $2; q=$1/y; if (r != 0) q=int(q+1); print q}'
    

    Not sure this one get any logical error or not. Please correct.

    0 讨论(0)
提交回复
热议问题