# bc: set number of digits after decimal point

`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?

• 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
• @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` Aug 17, 2016 at 18:53

Set the `scale` special variable:

``````\$ echo "scale=2; 100/3" | bc
33.33
``````
• See @Wok's comment on the question. Apr 28, 2016 at 11:59
• `\$ echo "scale=2; (100/180)*180" | bc` gives 99.00 :( Sep 9, 2016 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 :) 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. Aug 29, 2017 at 16:01
• 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

`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. Aug 17, 2016 at 18:55
• Thanks in particular for the hint that division by 1 gets rid of the decimal portion!
– porg
May 6 at 18:41

``````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
``````
• Yes, but `echo "scale=2; (1.0150876 / 100) * 100" | bc` returns `1.00` Apr 22, 2021 at 12:38

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

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

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
``````