99

bc handles numbers as integers:

# echo "100/3" | bc
33

bc -l handles numbers as floating point objects:

# echo "100/3" | bc -l
33.33333333333333333333

Is there a way to limit the number of digits after the decimal point?

2
  • 12
    Interestingly, this only works with division. If you want to do scale=0;1234*1.1, you have to write it as scale=0;1234*1.1/1 to get 1357. Otherwise, no matter the value of scale, you get 1357.4.
    – Wok
    May 12, 2014 at 13:37
  • 3
    @Wok, it's not dependent on division or multiplication. It depends on the input - the biggest precision number determines the precision in the output. Notice how 1234*1.0 will give you 1234.0
    – Richlv
    Aug 17, 2016 at 18:53

5 Answers 5

124

Set the scale special variable:

$ echo "scale=2; 100/3" | bc
33.33
6
  • 4
    See @Wok's comment on the question.
    – Adam Matan
    Apr 28, 2016 at 11:59
  • 1
    $ echo "scale=2; (100/180)*180" | bc gives 99.00 :( Sep 9, 2016 at 10:39
  • 1
    @DonatasOlsevičius this is because (100/180) = 0.55 and then (0.55 * 180) = 99. So it is giving you right value :) Feb 7, 2017 at 13:22
  • It would be nice if it rounded up if above .5. ~$ echo "scale=2; 12/104" | bc .11 If rounded up this would be .12. However, it should still do the job for my task.
    – jbrock
    Aug 29, 2017 at 16:01
  • 7
    You can maintain precision until printing the value this way: echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Now you get 99.99. Aug 13, 2018 at 1:44
20

scale works only for division; if some geeks need it in multiplication, then you can do achieve this by using string manipulation. Say if you need to multiply 32 * 0.60 , answer is 19.20. If you need to get it 19 alone in answer you can get it by different methods.

  1. Using String Manipulation

    $ S=$(echo "32*.60" | bc ) ; echo ${S%.*}
    19
    

    String Manipulation syntax: ${Variable%pattern}, this will delete short matching pattern that comes after %. For more String manipulation details see the Advanced Bash-Scripting Guide.

  2. Using Scale as stated by **chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. To get rid of the trailing 0s, instead of string manipulation, one can also do a divide by 1.

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    
2
  • 1
    Note that, as i mentioned in my comment on the question, it is not caused by multiplication, but rather by the input numbers having a decimal part. Or, to put it differently, the number with the "longest" decimal part will determine how many decimal places the output will have.
    – Richlv
    Aug 17, 2016 at 18:55
  • 2
    Thanks in particular for the hint that division by 1 gets rid of the decimal portion!
    – porg
    May 6, 2022 at 18:41
8

you can also use printf command to round off result upto 3 decimals

# printf "%.3f\n" $(echo "100/3" | bc -l)
3.333
6

In addition to previous answers

echo "scale=2; 1.0150876" | bc

Returns

1.0150876

Add Math operations to get only 2 decimal numbers - (NUMBER*100)/100

echo "scale=2; (1.0150876 * 100) / 100" | bc

Now returns

1.01
1
  • Yes, but echo "scale=2; (1.0150876 / 100) * 100" | bc returns 1.00
    – fraff
    Apr 22, 2021 at 12:38
3

Round-off

scale=2 truncates the answer to two decimal digits, but we can achieve round-off like so:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.