51

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?

  • 10
    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 '14 at 13:37
  • Shouldn't @Wok 's comment be on the accepted answer, rather than on the question? Until I read the answer, I had no idea what this comment was referring to. – Wilson F Apr 21 '16 at 15:59
  • 1
    @WilsonF Added a reference to the answer. – Adam Matan Apr 28 '16 at 11:59
  • 1
    @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 '16 at 18:53
69

Set the scale special variable:

$ echo "scale=2; 100/3" | bc
33.33
  • 2
    See @Wok's comment on the question. – Adam Matan Apr 28 '16 at 11:59
  • $ echo "scale=2; (100/180)*180" | bc gives 99.00 :( – Donatas Olsevičius Sep 9 '16 at 10:39
  • @DonatasOlsevičius this is because (100/180) = 0.55 and then (0.55 * 180) = 99. So it is giving you right value :) – Kamaldeep singh Bhatia Feb 7 '17 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 '17 at 16:01
  • 3
    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. – Byron Hawkins Aug 13 '18 at 1:44
10

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
    
  • 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 '16 at 18:55
4

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
3

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

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

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, privacy policy and cookie policy

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