Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rounding up float point numbers bash

Ok, so I'm trying to round up an input of 17.92857, so that it gets an input of 17.929 in bash.

My code so far is:

read input
echo "scale = 3; $input" | bc -l

However, when I use this, it doesn't round up, it returns 17.928.

Does anyone know any solutions to this?

like image 474
Quill Avatar asked Oct 20 '14 12:10

Quill


2 Answers

In case input contains a number, there is no need for an external command like bc. You can just use printf:

printf "%.3f\n" "$input"

Edit: In case the input is a formula, you should however use bc as in one of the following commands:

printf "%.3f\n" $(bc -l <<< "$input")
printf "%.3f\n" $(echo "$input" | bc -l)
like image 138
Tim Zimmermann Avatar answered Oct 29 '22 13:10

Tim Zimmermann


To extend Tim's answer, you can write a shell helper function round ${FLOAT} ${PRECISION} for this:

#!/usr/bin/env bash

round() {
  printf "%.${2}f" "${1}"
}

PI=3.14159

round ${PI} 0
echo
round ${PI} 1
echo
round ${PI} 2
echo
round ${PI} 3
echo
round ${PI} 4
echo
round ${PI} 5
echo
round ${PI} 6
echo

# Outputs:
3
3.1
3.14
3.142
3.1416
3.14159
3.141590

# To store in a variable:
ROUND_PI=$(round ${PI} 3)
echo ${ROUND_PI}

# Outputs:
3.142
like image 29
Zane Avatar answered Oct 29 '22 14:10

Zane